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   117 use strict;
  15         24  
  15         423  
4 15     15   65 use warnings;
  15         26  
  15         431  
5 15     15   65 use autodie;
  15         26  
  15         89  
6              
7             our $VERSION = '0.10'; # VERSION
8              
9 15     15   66236 use Carp;
  15         27  
  15         1177  
10              
11 15     15   90 use Exporter;
  15         25  
  15         496  
12 15     15   118 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 1590 sub seconds () { __PACKAGE__->new("seconds") }
24 6     6 1 541 sub minutes () { __PACKAGE__->new("minutes") }
25 4     4 1 563 sub hours () { __PACKAGE__->new("hours") }
26 5     5 1 1691 sub days () { __PACKAGE__->new("days") }
27 4     4 1 1068 sub weeks () { __PACKAGE__->new("weeks") }
28 4     4 1 1097 sub months () { __PACKAGE__->new("months") }
29 5     5 1 1089 sub years () { __PACKAGE__->new("years") }
30              
31              
32             #######################
33             # REGULAR CLASS STUFF #
34             #######################
35              
36             sub new
37             {
38 53     53 1 95 my ($class, $unit, $qty) = @_;
39 53 100       89 if (defined $qty)
40             {
41 19 100       104 croak("can only do integer math") unless $qty == int($qty);
42             }
43             else
44             {
45 34         40 $qty = 1;
46             }
47 46         171 return bless { qty => $qty, unit => $unit }, $class;
48             }
49              
50              
51             sub to_string
52             {
53 14     14 1 26 my $self = shift;
54              
55 14         21 my $qty = $self->{qty};
56 14         23 my $unit = $self->{unit};
57 14 100       48 $unit =~ s/s$// if $qty == 1;
58 14         137 return "$qty $unit";
59             }
60              
61              
62             ########################
63             # OVERLOADED OPERATORS #
64             ########################
65              
66             sub _add_to
67             {
68 29     29   50 my ($self, $operand) = @_;
69 29         41 my $unit = $self->{unit};
70 29         41 my $qty = $self->{qty};
71 29         40 my $method = "add_$unit";
72 29         108 return $operand->$method($qty);
73             }
74              
75             sub _subtract_from
76             {
77 16     16   22 my ($self, $operand) = @_;
78 16         26 my $unit = $self->{unit};
79 16         20 my $qty = $self->{qty};
80 16         25 my $method = "subtract_$unit";
81 16         62 return $operand->$method($qty);
82             }
83              
84             use overload
85 0     0   0 '""' => sub { shift->to_string },
86 14     14   4522 'cmp' => sub { $_[0]->to_string cmp $_[1] },
87              
88 12     12   1294 '+' => sub { shift->_add_to( @_ ) },
89 12 50   12   1722 '-' => sub { $_[2] ? shift->_subtract_from( @_ ) : croak("can't subtract from a unit") },
90 19     19   4300 '*' => sub { __PACKAGE__->new( $_[0]->{unit}, $_[0]->{qty} * $_[1] ) },
91 15     15   10661 ;
  15         33  
  15         271  
92              
93              
94              
95             1;
96              
97              
98              
99             # ABSTRACT: units objects for easy date/datetime math
100             # COPYRIGHT
101              
102             __END__