Apply a patch to support handle => sub { ... }, contributed by Frank Cuny.
gfx [Sat, 9 Jan 2010 07:54:42 +0000 (16:54 +0900)]
lib/Mouse/Meta/Attribute.pm
t/020_attributes/011_more_attr_delegation.t

index 41d80a6..61e9dba 100644 (file)
@@ -412,6 +412,11 @@ sub _canonicalize_handles {
     elsif (ref($handles) eq 'ARRAY') {
         return map { $_ => $_ } @$handles;
     }
+    elsif ( ref($handles) eq 'CODE' ) {
+        my $class_or_role = ( $self->{isa} || $self->{does} )
+            || $self->throw_error( "Cannot find delegate metaclass for attribute " . $self->name );
+        return $handles->( $self, Mouse::Meta::Class->initialize("$class_or_role"));
+    }
     elsif (ref($handles) eq 'Regexp') {
         my $class_or_role = ($self->{isa} || $self->{does})
             || $self->throw_error("Cannot delegate methods based on a Regexp without a type constraint (isa)");
index 15f8e6a..75d6fa1 100644 (file)
@@ -123,9 +123,6 @@ do not fail at compile time.
         );
     } "can't create attr with generative handles parameter and no isa";
 
-    our $TODO;
-{
-    local $TODO = 'handles => CODE is not supported';
     ::lives_ok {
         has child_d => (
             isa     => "ChildD",
@@ -137,7 +134,6 @@ do not fail at compile time.
             }
         );
     } "can't create attr with generative handles parameter and no isa";
-}
 
     ::lives_ok {
         has child_e => (
@@ -148,8 +144,6 @@ do not fail at compile time.
         );
     } "can delegate to non moose class using explicit method list";
 
-{
-    local $TODO = 'handles => CODE is not supported';
     my $delegate_class;
     ::lives_ok {
         has child_f => (
@@ -164,7 +158,6 @@ do not fail at compile time.
     } "subrefs on non moose class give no meta";
 
     ::is( $delegate_class, "ChildF", "plain classes are handed down to subs" );
-}
 
     ::lives_ok {
         has child_g => (