From: Stevan Little Date: Thu, 17 Aug 2006 16:50:09 +0000 (+0000) Subject: some more examples X-Git-Tag: 0_03~4 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=be33400260d5c3be940039bf5dd6a3299c0c3801;p=gitmo%2FMoose-Autobox.git some more examples --- diff --git a/examples/units/bytes.t b/examples/units/bytes.t new file mode 100644 index 0000000..7ca0d88 --- /dev/null +++ b/examples/units/bytes.t @@ -0,0 +1,41 @@ +#!/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"; + diff --git a/examples/units/time.t b/examples/units/time.t new file mode 100644 index 0000000..f04edd1 --- /dev/null +++ b/examples/units/time.t @@ -0,0 +1,68 @@ +#!/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; + + diff --git a/lib/Moose/Autobox/Code.pm b/lib/Moose/Autobox/Code.pm index e19ee54..c2e33a1 100644 --- a/lib/Moose/Autobox/Code.pm +++ b/lib/Moose/Autobox/Code.pm @@ -32,6 +32,8 @@ sub conjoin { return sub { $f->(@_) && $f2->(@_) } } +# fixed point combinators + sub u { my $f = shift; sub { $f->($f, @_) }; @@ -39,15 +41,9 @@ sub u { 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__ @@ -124,6 +120,8 @@ This implements the U combinator. =item L +=item L + =back =head1 BUGS