Acme-DateTime-Duration-Numeric

 view release on metacpan or  search on metacpan

Changes  view on Meta::CPAN

Revision history for Perl extension Acme::DateTime::Duration::Numeric

0.03  Tue Jan 15 17:45:46 PST 2008
        - reborn as autobox::DateTime::Duration

0.02  Tue Jan 15 17:15:39 PST 2008
        - Added DateTime and DateTime::Duration dependencies

0.01  Tue Jan 15 01:36:17 2008
        - original version

MANIFEST  view on Meta::CPAN

inc/Module/Install/Metadata.pm
inc/Module/Install/TestBase.pm
inc/Module/Install/Win32.pm
inc/Module/Install/WriteAll.pm
inc/Spiffy.pm
inc/Test/Base.pm
inc/Test/Base/Filter.pm
inc/Test/Builder.pm
inc/Test/Builder/Module.pm
inc/Test/More.pm
lib/Acme/DateTime/Duration/Numeric.pm
Makefile.PL
MANIFEST			This list of files
META.yml
README
t/00_compile.t
t/01_duration.t
t/02_ago_from_now.t

META.yml  view on Meta::CPAN

abstract: ActiveSupport equivalent to Perl numeric variables
author: Tatsuhiko Miyagawa <miyagawa@bulknews.net>
build_requires: 
  Test::More: 0
distribution_type: module
generated_by: Module::Install version 0.64
license: perl
name: Acme-DateTime-Duration-Numeric
no_index: 
  directory: 
    - inc
    - t
requires: 
  DateTime: 0
  DateTime::Duration: 0
  perl: 5.8.1
version: 0.03

Makefile.PL  view on Meta::CPAN

use inc::Module::Install;
name 'Acme-DateTime-Duration-Numeric';
all_from 'lib/Acme/DateTime/Duration/Numeric.pm';

requires 'DateTime';
requires 'DateTime::Duration';

build_requires 'Test::More';
use_test_base;
auto_include;
WriteAll;

README  view on Meta::CPAN

This is Perl module Acme::DateTime::Duration::Numeric.

INSTALLATION

Acme::DateTime::Duration::Numeric installation is straightforward. If your CPAN shell is set up,
you should just be able to do

    % cpan Acme::DateTime::Duration::Numeric

Download it, unpack it, then build it as per the usual:

    % perl Makefile.PL
    % make && make test

Then install it:

    % make install

DOCUMENTATION

Acme::DateTime::Duration::Numeric documentation is available as in POD. So you can do:

    % perldoc Acme::DateTime::Duration::Numeric

to read the documentation online with your favorite pager.

Tatsuhiko Miyagawa

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

package Acme::DateTime::Duration::Numeric;

use strict;
use 5.8.1;
our $VERSION = '0.03';

use overload '""' => \&value, '+0' => \&value, fallback => 1;
use DateTime;
use DateTime::Duration;

sub import {
    ## Should we do this for 'float' as well?
    overload::constant integer => sub { Acme::DateTime::Duration::Numeric->new(@_) };

    ## Gross hack to bypass DateTime's Params::Validate check
    $Params::Validate::NO_VALIDATION = 1;
}

sub new {
    my($class, $value) = @_;
    bless { value => $value }, $class;
}

sub value { $_[0]->{value} }

for my $accessor (qw( day hour minute month second week year )) {
    no strict 'refs';
    my $plural = $accessor . "s";
    *$accessor = *$plural = sub {
        my $self = shift;
        DateTime::Duration->new($plural => $self->{value});
    };
}

sub fortnight {
    my $self = shift;
    DateTime::Duration->new(weeks => 2 * $self->{value});
}

*fortnights = \&fortnight;

sub DateTime::Duration::ago {
    my $duration = shift;
    my $dt = $_[0] ? $_[0]->clone : DateTime->now;
    $dt->subtract_duration($duration);
}

*DateTime::Duration::until = \&DateTime::Duration::ago;

sub DateTime::Duration::from_now {
    my $duration = shift;
    my $dt = $_[0] ? $_[0]->clone : DateTime->now;
    $dt->add_duration($duration);
}

*DateTime::Duration::since = \&DateTime::Duration::from_now;

1;
__END__

=for stopwords DateTime ActiveSupport

=head1 NAME

Acme::DateTime::Duration::Numeric - ActiveSupport equivalent to Perl numeric variables

=head1 WARNING

This module is deprecated. Use L<autobox::DateTime::Duration> instead.

=head1 SYNOPSIS

  use Acme::DateTime::Duration::Numeric;

  # equivalent to DateTime::Duration->new(months => 1, days => 5);
  $duration = 1->month + 2->days;

  # equivalent to DateTime->now->add(years => 2);
  $datetime = 2->years->from_now;

  # equivalent to DateTime->now->add(months => 4, years => 5);
  $datetime = (4->months + 5->years)->from_now;

  # equivalent to DateTime->now->subtract(days => 3);
  $datetime = 3->days->ago;

=head1 DESCRIPTION

Acme::DateTime::Duration::Numeric is a module to add Time-related
methods to core integer values by using constant overloading. Inspired
by ActiveSupport (Rails) Core extensions to Numeric values.

=head1 BUGS

Using this module will turn off all Params::Validate validation since
I couldn't figure out how to make the object bypass its checks against
scalar data type in DateTime method calls.

Because it uses constant overloading, I'm not surprised there may be
other modules breaking when this module is in use.

=head1 AUTHOR

Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt>

=head1 LICENSE

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=head1 SEE ALSO

L<autobox::DateTime::Duration>

L<http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Numeric/Time.html>

L<DateTime::Duration>, L<bigint>, L<overload>

=cut

t/00_compile.t  view on Meta::CPAN

use strict;
use Test::More tests => 1;

BEGIN { use_ok 'Acme::DateTime::Duration::Numeric' }

t/01_duration.t  view on Meta::CPAN

use strict;
use warnings;
use Test::Base;
use Acme::DateTime::Duration::Numeric;
use DateTime;

filters { expected => 'chomp' };

my $base = DateTime->new(year => 2008, month => 1, day => 15);

plan tests => 1 * blocks;

run {
    my $block = shift;
    my $duration = eval "use Acme::DateTime::Duration::Numeric;" . $block->input;
    die $@ if $@;
    is $base->clone->add_duration($duration)->iso8601, $block->expected, $block->input;
};

__END__

===
--- input: 1->day
--- expected: 2008-01-16T00:00:00

t/02_ago_from_now.t  view on Meta::CPAN

use strict;
use warnings;
use Test::Base;
use Acme::DateTime::Duration::Numeric;
use DateTime;

filters { expected => 'chomp', input => 'chomp' };

my $base = DateTime->new(year => 2008, month => 1, day => 15);

plan tests => 1 * blocks;

run {
    my $block = shift;
    my $datetime = eval "use Acme::DateTime::Duration::Numeric;" . $block->input . "(\$base)";
    die $@ if $@;
    is $datetime->iso8601, $block->expected, $block->input;
};

__END__

===
--- input: 1->year->ago
--- expected: 2007-01-15T00:00:00



( run in 0.432 second using v1.01-cache-2.11-cpan-05444aca049 )