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 )