--- /dev/null
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Moose::Autobox;
+
+{
+ package Units::Bytes;
+ use Moose::Role;
+ use Moose::Autobox;
+
+ sub bytes { $_[0] }
+ sub kilobytes { $_[0] * 1024 }
+ sub megabytes { $_[0] * 1024->kilobytes }
+ sub gigabytes { $_[0] * 1024->megabytes }
+ sub terabytes { $_[0] * 1024->gigabytes }
+
+ {
+ no warnings 'once'; # << squelch the stupid "used only once, maybe typo" warnings
+ *byte = \&bytes;
+ *kilobyte = \&kilobytes;
+ *megabyte = \&megabytes;
+ *gigabyte = \&gigabytes;
+ *terabyte = \&terabytes;
+ }
+}
+
+{
+ package Moose::Autobox::SCALAR;
+ use Moose 'with';
+ with 'Units::Bytes';
+}
+
+$\ = "\n";
+
+print "5 kilobytes are " . 5->kilobytes . " bytes";
+print "2 megabytes are " . 2->megabytes . " bytes";
+print "1 gigabyte is " . 1->gigabyte . " bytes";
+print "2 terabyes are " . 2->terabytes . " bytes";
+
--- /dev/null
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Moose::Autobox;
+use Moose::Autobox::Undef;
+
+{
+ package Units::Time;
+ use Moose::Role;
+ use Moose::Autobox;
+
+ sub seconds { $_[0] }
+ sub minutes { $_[0] * 60 }
+ sub hours { $_[0] * 60->minutes }
+ sub days { $_[0] * 24->hours }
+ sub weeks { $_[0] * 7->days }
+ sub years { $_[0] * 365->days }
+ sub centuries { $_[0] * 10->years }
+
+ sub ago {
+ my ($self, $time) = @_;
+ $time ||= time();
+ $time - $self;
+ }
+
+ sub since {
+ my ($self, $time) = @_;
+ $time ||= time();
+ $time + $self;
+ }
+
+ {
+ no warnings 'once';
+
+ # singular versions
+ *second = \&seconds;
+ *minute = \&minutes;
+ *hour = \&hours;
+ *day = \&days;
+ *week = \&weeks;
+ *year = \&years;
+ *century = \¢uries;
+
+ *til = \&ago;
+ *from_now = \&since;
+ }
+
+ sub as_string { scalar localtime $_[0] }
+
+}
+
+{
+ package Moose::Autobox::SCALAR;
+ use Moose 'with';
+ with 'Units::Time';
+}
+
+$\ = "\n";
+
+print "2 days ago was : " . 2->days->ago->as_string;
+print "3 weeks from now will be : " . 3->weeks->from_now->as_string;
+my $one_week_ago = 1->week->ago;
+print "1 day until 1 week ago : " . 1->day->til($one_week_ago)->as_string;
+print "2 years since 1 week ago : " . 2->years->since($one_week_ago)->as_string;
+
+
return sub { $f->(@_) && $f2->(@_) }
}
+# fixed point combinators
+
sub u {
my $f = shift;
sub { $f->($f, @_) };
sub y {
my $f = shift;
- (sub { my $h = shift; sub { $f->(($h->u())->())->(@_) } }->u())->();
+ (sub { my $h = shift; sub { $f->(($h->u)->())->(@_) } }->u)->();
}
-#sub dump {
- #my ($self) = @_;
- #require Data::Dump::Streamer;
- #return Data::Dump::Streamer::Dump($self)->Out();
-#}
-
1;
__END__
=item L<http://en.wikipedia.org/wiki/Fixed_point_combinator>
+=item L<http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/20469>
+
=back
=head1 BUGS