Use the already-existing anon class caching in MM::Class, rather than implementing...
Dave Rolsky [Mon, 8 Feb 2010 16:36:35 +0000 (10:36 -0600)]
lib/Moose/Meta/Role/Application/ToInstance.pm

index 2638749..f7c2b14 100644 (file)
@@ -17,35 +17,24 @@ __PACKAGE__->meta->add_attribute('rebless_params' => (
     default => sub { {} }
 ));
 
-my %ANON_CLASSES;
-
 sub apply {
-    my ($self, $role, $object) = @_;
-
-    my $anon_role_key = (blessed($object) . $role->name);
-
-    my $class;
-    if (exists $ANON_CLASSES{$anon_role_key} && defined $ANON_CLASSES{$anon_role_key}) {
-        $class = $ANON_CLASSES{$anon_role_key};
-    }
-    else {
-        my $obj_meta = Class::MOP::class_of($object) || 'Moose::Meta::Class';
-
-        # This is a special case to handle the case where the object's
-        # metaclass is a Class::MOP::Class, but _not_ a Moose::Meta::Class
-        # (for example, when applying a role to a Moose::Meta::Attribute
-        # object).
-        $obj_meta = 'Moose::Meta::Class'
-            unless $obj_meta->isa('Moose::Meta::Class');
-
-        $class = $obj_meta->create_anon_class(
-            superclasses => [ blessed($object) ]
-        );
-        $ANON_CLASSES{$anon_role_key} = $class;
-        $self->SUPER::apply($role, $class);
-    }
-
-    $class->rebless_instance($object, %{$self->rebless_params});
+    my ( $self, $role, $object ) = @_;
+
+    my $obj_meta = Class::MOP::class_of($object) || 'Moose::Meta::Class';
+
+    # This is a special case to handle the case where the object's metaclass
+    # is a Class::MOP::Class, but _not_ a Moose::Meta::Class (for example,
+    # when applying a role to a Moose::Meta::Attribute object).
+    $obj_meta = 'Moose::Meta::Class'
+        unless $obj_meta->isa('Moose::Meta::Class');
+
+    my $class = $obj_meta->create_anon_class(
+        superclasses => [ blessed($object) ], cache => 1,
+    );
+
+    $self->SUPER::apply( $role, $class );
+
+    $class->rebless_instance( $object, %{ $self->rebless_params } );
 }
 
 1;