Fix meta() and initialize() for more compatibility
[gitmo/Mouse.git] / lib / Mouse / Object.pm
index 217b7dc..745d1f2 100644 (file)
@@ -102,10 +102,23 @@ sub DEMOLISHALL {
 
     no strict 'refs';
 
-    for my $class ($self->meta->linearized_isa) {
-        my $code = *{ $class . '::DEMOLISH' }{CODE}
-            or next;
-        $code->($self, @_);
+    my @isa;
+    if ( my $meta = Mouse::class_of($self) ) {
+        @isa = $meta->linearized_isa;
+    } else {
+        # We cannot count on being able to retrieve a previously made
+        # metaclass, _or_ being able to make a new one during global
+        # destruction. However, we should still be able to use mro at
+        # that time (at least tests suggest so ;)
+        my $class_name = ref $self;
+        @isa = @{ Mouse::Util::get_linear_isa($class_name) }
+    }
+
+    foreach my $class (@isa) {
+        no strict 'refs';
+        my $demolish = *{"${class}::DEMOLISH"}{CODE};
+        $self->$demolish
+            if defined $demolish;
     }
 }
 
@@ -123,7 +136,7 @@ sub does {
         || confess "You must supply a role name to does()";
     my $meta = $self->meta;
     foreach my $class ($meta->linearized_isa) {
-        my $m = $meta->initialize($class);
+        my $m = ref($meta)->initialize($class);
         return 1 
             if $m->can('does_role') && $m->does_role($role_name);            
     }