X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FAutobox.pm;h=7ec3dc3cab701d5e28295e5aa1b2b3ba88292905;hb=7f9d7a3aea0d005c84b9853b91c8938bd04f01f3;hp=967778e9a80090fc9485e2a6f9bb18d7e1019795;hpb=6cf5bcf23399cc82e234f91a2e78f262bf70eab1;p=gitmo%2FMoose-Autobox.git diff --git a/lib/Moose/Autobox.pm b/lib/Moose/Autobox.pm index 967778e..7ec3dc3 100644 --- a/lib/Moose/Autobox.pm +++ b/lib/Moose/Autobox.pm @@ -4,32 +4,74 @@ package Moose::Autobox; use strict; use warnings; -use Moose qw(confess); +use Carp qw(confess); use Scalar::Util (); +use Moose::Util (); -our $VERSION = '0.01'; - -#sub import { -# eval q| -package SCALAR; -use Moose; -with 'Moose::Autobox::Scalar'; - -package ARRAY; -use Moose; -with 'Moose::Autobox::Array'; - -package HASH; -use Moose; -with 'Moose::Autobox::Hash'; - -package CODE; -use Moose; -with 'Moose::Autobox::Code'; -# |; -# confess 'Could not create autobox packages because - ' . $@ if $@; -#} +our $VERSION = '0.07'; +use base 'autobox'; + +use Moose::Autobox::Undef; + +sub import { + (shift)->SUPER::import( + DEFAULT => 'Moose::Autobox::', + UNDEF => 'Moose::Autobox::Undef', + ); +} + +sub mixin_additional_role { + my ($class, $type, $role) = @_; + ($type =~ /SCALAR|ARRAY|HASH|CODE/) + || confess "Can only add additional roles to SCALAR, ARRAY, HASH or CODE"; + Moose::Util::apply_all_roles(('Moose::Autobox::' . $type)->meta, ($role)); +} + +{ + + package Moose::Autobox::SCALAR; + + use Moose::Autobox::Scalar; + + use metaclass 'Moose::Meta::Class'; + + Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Scalar')); + + *does = \&Moose::Object::does; + + package Moose::Autobox::ARRAY; + + use Moose::Autobox::Array; + + use metaclass 'Moose::Meta::Class'; + + Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Array')); + + *does = \&Moose::Object::does; + + package Moose::Autobox::HASH; + + use Moose::Autobox::Hash; + + use metaclass 'Moose::Meta::Class'; + + Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Hash')); + + *does = \&Moose::Object::does; + + package Moose::Autobox::CODE; + + use Moose::Autobox::Code; + + use metaclass 'Moose::Meta::Class'; + + Moose::Util::apply_all_roles(__PACKAGE__->meta, ('Moose::Autobox::Code')); + + *does = \&Moose::Object::does; + +} + 1; __END__ @@ -38,32 +80,81 @@ __END__ =head1 NAME -Moose::Autobox - autoboxed for her pleasure +Moose::Autobox - Autoboxed wrappers for Native Perl datatypes =head1 SYNOPOSIS use Moose::Autobox; - use autobox; - - print "Squares: " . [ 1 .. 10 ]->map(sub { $_ * $_ })->join(', '); + + print 'Print squares from 1 to 10 : '; + print [ 1 .. 10 ]->map(sub { $_ * $_ })->join(', '); =head1 DESCRIPTION -=head1 ROLES +Moose::Autobox provides an implementation of SCALAR, ARRAY, HASH +& CODE for use with L. It does this using a hierarchy of +roles in a manner similar to what Perl 6 I do. This module, +like L and L, was inspired by my work on the +Perl 6 Object Space, and the 'core types' implemented there. - Item - Undef - Defined - Value - Scalar* - Ref - List - Array* - Hash* - Code* +=head2 A quick word about autobox - * indicates actual autoboxed types +The L module provides the ability for calling 'methods' +on normal Perl values like Scalars, Arrays, Hashes and Code +references. This gives the illusion that Perl's types are first-class +objects. However, this is only an illusion, albeit a very nice one. +I created this module because L itself does not actually +provide an implementation for the Perl types but instead only provides +the 'hooks' for others to add implementation too. +=head2 Is this for real? or just play? + +Several people are using this module in serious applications and +it seems to be quite stable. The underlying technologies of L +and L are also considered stable. There is some performance +hit, but as I am fond of saying, nothing in life is free. If you have +any questions regarding this module, either email me, or stop by #moose +on irc.perl.org and ask around. + +=head2 Adding additional methods + +B asks L to use the B namespace +prefix so as to avoid stepping on the toes of other L modules. This +means that if you want to add methods to a particular perl type +(i.e. - monkeypatch), then you must do this: + + sub Moose::Autobox::SCALAR::bar { 42 } + +instead of this: + + sub SCALAR::bar { 42 + +as you would with vanilla autobox. + +=head1 METHODS + +=over 4 + +=item B + +This will mixin an additonal C<$role> into a certain C<$type>. The +types can be SCALAR, ARRAY, HASH or CODE. + +This can be used to add additional methods to the types, see the +F directory for some examples. + +=back + +=head1 TODO + +=over 4 + +=item More docs + +=item More tests + +=back + =head1 BUGS All complex software has bugs lurking in it, and this module is no @@ -74,9 +165,17 @@ to cpan-RT. Stevan Little Estevan@iinteractive.comE +B + +Anders (Debolaz) Nor Berle + +Matt (mst) Trout + +renormalist + =head1 COPYRIGHT AND LICENSE -Copyright 2006 by Infinity Interactive, Inc. +Copyright 2006-2008 by Infinity Interactive, Inc. L