DateTime

 view release on metacpan or  search on metacpan

lib/DateTime/Duration.pm  view on Meta::CPAN

package DateTime::Duration;

use strict;
use warnings;
use namespace::autoclean;

our $VERSION = '1.66';

use Carp ();
use DateTime;
use DateTime::Helpers;
use DateTime::Types;
use Params::ValidationCompiler 0.26 qw( validation_for );
use Scalar::Util qw( blessed );

use overload (
    fallback => 1,
    '+'      => '_add_overload',
    '-'      => '_subtract_overload',
    '*'      => '_multiply_overload',
    '<=>'    => '_compare_overload',
    'cmp'    => '_compare_overload',
);

sub MAX_NANOSECONDS () {1_000_000_000}    # 1E9 = almost 32 bits

my @all_units = qw( months days minutes seconds nanoseconds );

{
    my %units = map {
        $_ => {

            # XXX - what we really want is to accept an integer, Inf, -Inf,
            # and NaN, but I can't figure out how to accept NaN since it never
            # compares to anything.
            type    => t('Defined'),
            default => 0,
        }
        } qw(
        years
        months
        weeks
        days
        hours
        minutes
        seconds
        nanoseconds
        );

    my $check = validation_for(
        name             => '_check_new_params',
        name_is_optional => 1,
        params           => {
            %units,
            end_of_month => {
                type     => t('EndOfMonthMode'),
                optional => 1,
            },
        },
    );

    sub new {
        my $class = shift;
        my %p     = $check->(@_);

        my $self = bless {}, $class;

        $self->{months} = ( $p{years} * 12 ) + $p{months};

        $self->{days} = ( $p{weeks} * 7 ) + $p{days};

        $self->{minutes} = ( $p{hours} * 60 ) + $p{minutes};

        $self->{seconds} = $p{seconds};

        if ( $p{nanoseconds} ) {
            $self->{nanoseconds} = $p{nanoseconds};
            $self->_normalize_nanoseconds;
        }
        else {

            # shortcut - if they don't need nanoseconds
            $self->{nanoseconds} = 0;
        }

        $self->{end_of_month} = (
              defined $p{end_of_month} ? $p{end_of_month}
            : $self->{months} < 0      ? 'preserve'
            :                            'wrap'
        );

        return $self;
    }
}



( run in 0.960 second using v1.01-cache-2.11-cpan-39bf76dae61 )