Date-Calc-Iterator

 view release on metacpan or  search on metacpan

lib/Date/Calc/Iterator.pm  view on Meta::CPAN

package Date::Calc::Iterator;

use 5.006;
use strict;
use warnings;

our $VERSION = '1.02';

use Date::Calc qw( Delta_Days Add_Delta_Days check_date ) ;
use Ref::Util  qw( is_arrayref is_ref );
use Carp       qw( croak );

use constant FORMAT_ARRAYREF    => 1;
use constant FORMAT_ISO_DASHED  => 2;
use constant FORMAT_ISO_NO_DASH => 3;

use constant DEFAULT_STEP_SIZE  => 1;

sub new {
  my $self  = shift ;
  my %parms = @_ ;

  my $class = ref $self || $self ;

  my ($from, $from_format) = _validate_date_param(\%parms, 'from');
  my ($to,   $to_format)   = _validate_date_param(\%parms, 'to');

  # TODO: should we require that the from format matches the to format?

  if (exists($parms{step}) && $parms{step} !~ /^\d+$/) {
      croak "the 'step' parameter must be an integer";
  }

  my $object          = {
                          from   => $from,
                          to     => $to,
                          format => $from_format,
                          delta  => 0,
                        };

  $object->{step}     = exists($parms{step}) ? $parms{step} : DEFAULT_STEP_SIZE;
  $object->{maxdelta} = Delta_Days(@{$from}, @{$to}) ;

  return bless($object, $class);
}

sub _validate_date_param
{
    my ($params, $key) = @_;
    my $date           = $params->{$key};
    my $ymdref;
    my $format;

    croak "you must provide a '$key' date" unless defined($date);

    if (is_arrayref($date)) {
        $ymdref = $date;
        $format = FORMAT_ARRAYREF;
    }
    elsif (is_ref($date)) {
        croak "unexpected reference type for '$key' parameter";
    }
    # TODO: should probably make these [0-9] instead of \d
    elsif ($date =~ /^(\d\d\d\d)-(\d\d)-(\d\d)$/) {
        $ymdref = [$1, $2, $3];
        $format = FORMAT_ISO_DASHED;
    }
    elsif ($date =~ /^(\d\d\d\d)(\d\d)(\d\d)$/) {
        $ymdref = [$1, $2, $3];
        $format = FORMAT_ISO_NO_DASH;



( run in 0.949 second using v1.01-cache-2.11-cpan-6aa56a78535 )