more examples
Stevan Little [Thu, 17 Aug 2006 16:58:14 +0000 (16:58 +0000)]
examples/units/bytes.t
examples/units/time.t
lib/Moose/Autobox.pm
t/003_p6_example.t

index 7ca0d88..bea2992 100644 (file)
@@ -26,11 +26,7 @@ use Moose::Autobox;
     }
 }
 
-{
-    package Moose::Autobox::SCALAR;
-    use Moose 'with';
-    with 'Units::Bytes';
-}
+Moose::Autobox->mixin_additional_role(SCALAR => 'Units::Bytes');
 
 $\ = "\n";
 
index f04edd1..10f228c 100644 (file)
@@ -51,11 +51,7 @@ use Moose::Autobox::Undef;
 
 }
 
-{
-    package Moose::Autobox::SCALAR;
-    use Moose 'with';
-    with 'Units::Time';
-}
+Moose::Autobox->mixin_additional_role(SCALAR => 'Units::Time');
 
 $\ = "\n";
 
index 775f6a4..7899bb7 100644 (file)
@@ -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<autobox> 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<mixin_additional_role ($type, $role)>
+
+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<examples/units/> 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 
index 054f966..bead570 100644 (file)
@@ -37,11 +37,7 @@ This comes from one of the examples in the Pugs distro.
     }
 }
 
-{
-    package Moose::Autobox::SCALAR;
-    use Moose 'with';
-    with 'Units::Bytes';
-}
+Moose::Autobox->mixin_additional_role(SCALAR => 'Units::Bytes');
 
 sub testing_bytes {
     ::dies_ok { 10->bytes } '... cannot do the autoboxing lexically';