Commit | Line | Data |
be334002 |
1 | #!/usr/bin/perl |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
6 | use Moose::Autobox; |
be334002 |
7 | |
8 | { |
9 | package Units::Time; |
10 | use Moose::Role; |
11 | use Moose::Autobox; |
12 | |
13 | sub seconds { $_[0] } |
14 | sub minutes { $_[0] * 60 } |
15 | sub hours { $_[0] * 60->minutes } |
16 | sub days { $_[0] * 24->hours } |
17 | sub weeks { $_[0] * 7->days } |
18 | sub years { $_[0] * 365->days } |
19 | sub centuries { $_[0] * 10->years } |
20 | |
21 | sub ago { |
22 | my ($self, $time) = @_; |
23 | $time ||= time(); |
24 | $time - $self; |
25 | } |
26 | |
27 | sub since { |
28 | my ($self, $time) = @_; |
29 | $time ||= time(); |
30 | $time + $self; |
31 | } |
32 | |
33 | { |
34 | no warnings 'once'; |
35 | |
36 | # singular versions |
37 | *second = \&seconds; |
38 | *minute = \&minutes; |
39 | *hour = \&hours; |
40 | *day = \&days; |
41 | *week = \&weeks; |
42 | *year = \&years; |
43 | *century = \¢uries; |
44 | |
45 | *til = \&ago; |
46 | *from_now = \&since; |
47 | } |
48 | |
49 | sub as_string { scalar localtime $_[0] } |
50 | |
51 | } |
52 | |
244bd352 |
53 | Moose::Autobox->mixin_additional_role(SCALAR => 'Units::Time'); |
be334002 |
54 | |
55 | $\ = "\n"; |
56 | |
57 | print "2 days ago was : " . 2->days->ago->as_string; |
58 | print "3 weeks from now will be : " . 3->weeks->from_now->as_string; |
59 | my $one_week_ago = 1->week->ago; |
60 | print "1 day until 1 week ago : " . 1->day->til($one_week_ago)->as_string; |
61 | print "2 years since 1 week ago : " . 2->years->since($one_week_ago)->as_string; |
62 | |
63 | |