X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FAutobox.pm;h=7899bb78901f7cda473ddc22adff7fb43b14e080;hb=244bd352801e30561098541bd2a7313234374810;hp=775f6a4f56b5036cd22badc14408ed1360cbe03b;hpb=be33400260d5c3be940039bf5dd6a3299c0c3801;p=gitmo%2FMoose-Autobox.git diff --git a/lib/Moose/Autobox.pm b/lib/Moose/Autobox.pm index 775f6a4..7899bb7 100644 --- a/lib/Moose/Autobox.pm +++ b/lib/Moose/Autobox.pm @@ -17,38 +17,49 @@ sub import { UNDEF => 'Moose::Autobox::Undef', ); } - -package Moose::Autobox::SCALAR; -# NOTE: -# this doesnt make sense, but -# I need to prevent Moose from -# assiging to @ISA -use base 'UNIVERSAL'; -use Moose; -with 'Moose::Autobox::Scalar'; - -*does = \&Moose::Object::does; - -package Moose::Autobox::ARRAY; -use base 'UNIVERSAL'; -use Moose; -with 'Moose::Autobox::Array'; - -*does = \&Moose::Object::does; - -package Moose::Autobox::HASH; -use base 'UNIVERSAL'; -use Moose; -with 'Moose::Autobox::Hash'; -*does = \&Moose::Object::does; - -package Moose::Autobox::CODE; -use base 'UNIVERSAL'; -use Moose; -with 'Moose::Autobox::Code'; +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::Autobox::' . $type)->meta->_apply_all_roles($role); +} -*does = \&Moose::Object::does; +{ + + package Moose::Autobox::SCALAR; + # NOTE: + # this doesnt make sense, but + # I need to prevent Moose from + # assiging to @ISA + use base 'UNIVERSAL'; + use Moose; + with 'Moose::Autobox::Scalar'; + + *does = \&Moose::Object::does; + + package Moose::Autobox::ARRAY; + use base 'UNIVERSAL'; + use Moose; + with 'Moose::Autobox::Array'; + + *does = \&Moose::Object::does; + + package Moose::Autobox::HASH; + use base 'UNIVERSAL'; + use Moose; + with 'Moose::Autobox::Hash'; + + *does = \&Moose::Object::does; + + package Moose::Autobox::CODE; + use base 'UNIVERSAL'; + use Moose; + with 'Moose::Autobox::Code'; + + *does = \&Moose::Object::does; + +} 1; @@ -107,26 +118,19 @@ possible. This may or may not be possible, depending on how well L works out. At this point, I have high hopes for things but only time (and more tests and code) will tell. -=head1 ROLES - -This is a rough diagram of the roles involved to get our 4 -autoboxed types (SCALAR, ARRAY, HASH & CODE). - - +------------------------+-------------------------------+ - | Identity | Behavioral | - +------------------------+-------------------------------+ - | Item | | - | Undef | | - | Defined | | - | Scalar* <-|- String, Number <--+ | - | Ref | |-- Value | - | Array* <-|- List <------------+ | - | Hash* | | - | Code* | | - | | | - +------------------------+-------------------------------+ - - * indicates actual autoboxed types +=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 @@ -138,14 +142,6 @@ autoboxed types (SCALAR, ARRAY, HASH & CODE). =back -=head1 NOTES - - - String, Number & List are currently the only 'Value's. - - - Indexed is pretty much an interface, we probably will - need more of these (see Smalltalk Collection Trait - Refactoring) - =head1 BUGS All complex software has bugs lurking in it, and this module is no