File Coverage

blib/lib/Date/Easy/Units.pm
Criterion Covered Total %
statement 52 53 98.1
branch 7 8 87.5
condition n/a
subroutine 22 23 95.6
pod 9 9 100.0
total 90 93 96.7


line stmt bran cond sub pod time code
1             package Date::Easy::Units;
2              
3 15     15   111 use strict;
  15         34  
  15         537  
4 15     15   78 use warnings;
  15         31  
  15         443  
5 15     15   90 use autodie;
  15         28  
  15         140  
6              
7             our $VERSION = '0.09'; # VERSION
8              
9 15     15   80925 use Carp;
  15         35  
  15         1182  
10              
11 15     15   178 use Exporter;
  15         30  
  15         616  
12 15     15   106 use parent 'Exporter';
  15         27  
  15         87  
13             my @date_units = qw< days weeks months years >;
14             my @datetime_units = (qw< seconds minutes hours >, @date_units);
15             our @EXPORT_OK = @datetime_units;
16             our %EXPORT_TAGS = ( date => \@date_units, datetime => \@datetime_units, all => \@EXPORT_OK );
17              
18              
19             ##############################
20             # FUNCTIONS (*NOT* METHODS!) #
21             ##############################
22              
23 6     6 1 2031 sub seconds () { __PACKAGE__->new("seconds") }
24 6     6 1 658 sub minutes () { __PACKAGE__->new("minutes") }
25 4     4 1 636 sub hours () { __PACKAGE__->new("hours") }
26 5     5 1 2120 sub days () { __PACKAGE__->new("days") }
27 4     4 1 1315 sub weeks () { __PACKAGE__->new("weeks") }
28 4     4 1 1322 sub months () { __PACKAGE__->new("months") }
29 5     5 1 1304 sub years () { __PACKAGE__->new("years") }
30              
31              
32             #######################
33             # REGULAR CLASS STUFF #
34             #######################
35              
36             sub new
37             {
38 53     53 1 109 my ($class, $unit, $qty) = @_;
39 53 100       109 if (defined $qty)
40             {
41 19 100       123 croak("can only do integer math") unless $qty == int($qty);
42             }
43             else
44             {
45 34         48 $qty = 1;
46             }
47 46         197 return bless { qty => $qty, unit => $unit }, $class;
48             }
49              
50              
51             sub to_string
52             {
53 14     14 1 28 my $self = shift;
54              
55 14         29 my $qty = $self->{qty};
56 14         24 my $unit = $self->{unit};
57 14 100       55 $unit =~ s/s$// if $qty == 1;
58 14         163 return "$qty $unit";
59             }
60              
61              
62             ########################
63             # OVERLOADED OPERATORS #
64             ########################
65              
66             sub _add_to
67             {
68 29     29   51 my ($self, $operand) = @_;
69 29         55 my $unit = $self->{unit};
70 29         47 my $qty = $self->{qty};
71 29         56 my $method = "add_$unit";
72 29         121 return $operand->$method($qty);
73             }
74              
75             sub _subtract_from
76             {
77 16     16   30 my ($self, $operand) = @_;
78 16         31 my $unit = $self->{unit};
79 16         21 my $qty = $self->{qty};
80 16         32 my $method = "subtract_$unit";
81 16         74 return $operand->$method($qty);
82             }
83              
84             use overload
85 0     0   0 '""' => sub { shift->to_string },
86 14     14   5386 'cmp' => sub { $_[0]->to_string cmp $_[1] },
87              
88 12     12   1536 '+' => sub { shift->_add_to( @_ ) },
89 12 50   12   2052 '-' => sub { $_[2] ? shift->_subtract_from( @_ ) : croak("can't subtract from a unit") },
90 19     19   5196 '*' => sub { __PACKAGE__->new( $_[0]->{unit}, $_[0]->{qty} * $_[1] ) },
91 15     15   12593 ;
  15         81  
  15         324  
92              
93              
94              
95             1;
96              
97              
98              
99             # ABSTRACT: units objects for easy date/datetime math
100             # COPYRIGHT
101              
102             __END__