the __MOP__ slot should be used for any weak class, not just anon
Jesse Luehrs [Fri, 1 Oct 2010 04:59:32 +0000 (23:59 -0500)]
lib/Class/MOP/Class.pm
t/048_anon_class_create_init.t

index 6648927..a40c1c8 100644 (file)
@@ -604,7 +604,7 @@ sub _construct_instance {
     }
     # NOTE:
     # this will only work for a HASH instance type
-    if ($class->is_anon_class) {
+    if (Class::MOP::metaclass_is_weak($class->name)) {
         (reftype($instance) eq 'HASH')
             || confess "Currently only HASH based instances are supported with instance of anon-classes";
         # NOTE:
@@ -686,7 +686,7 @@ sub _force_rebless_instance {
     $old_metaclass->rebless_instance_away($instance, $self, %params)
         if $old_metaclass;
 
-    if ($old_metaclass->is_anon_class) {
+    if (Class::MOP::metaclass_is_weak($old_metaclass->name)) {
         delete $instance->{__MOP__};
     }
 
@@ -700,7 +700,7 @@ sub _force_rebless_instance {
 
     # NOTE:
     # this will only work for a HASH instance type
-    if ($self->is_anon_class) {
+    if (Class::MOP::metaclass_is_weak($self->name)) {
         (reftype($instance) eq 'HASH')
             || confess "Currently only HASH based instances are supported with instance of anon-classes";
         # NOTE:
index e24319c..4cda746 100644 (file)
@@ -117,4 +117,20 @@ my $instance;
     }
 }
 
+{
+    my $meta = Class::MOP::Class->create(
+        'Baz',
+        weaken => 1,
+    );
+    $instance = $meta->new_object;
+}
+{
+    my $meta = Class::MOP::class_of($instance);
+    Scalar::Util::weaken($meta);
+    ok($meta, "weak class is kept alive by existing instances");
+
+    undef $instance;
+    ok(!$meta, "weak class is collected once instances go away");
+}
+
 done_testing;