Refactoring
[gitmo/Mouse.git] / lib / Mouse / Object.pm
index 217b7dc..8871a19 100644 (file)
@@ -92,6 +92,7 @@ sub BUILDALL {
             or next;
         $code->($self, @_);
     }
+    return;
 }
 
 sub DEMOLISHALL {
@@ -102,18 +103,32 @@ 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::Meta::Class::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;
     }
+    return;
 }
 
 sub dump { 
     my $self = shift;
     require Data::Dumper;
     local $Data::Dumper::Maxdepth = shift if @_;
-    Data::Dumper::Dumper $self;
+    Data::Dumper::Dumper($self);
 }
 
 
@@ -121,13 +136,14 @@ sub does {
     my ($self, $role_name) = @_;
     (defined $role_name)
         || confess "You must supply a role name to does()";
+
     my $meta = $self->meta;
     foreach my $class ($meta->linearized_isa) {
-        my $m = $meta->initialize($class);
-        return 1 
-            if $m->can('does_role') && $m->does_role($role_name);            
+        my $m = ref($meta)->initialize($class);
+        return 1
+            if $m->can('does_role') && $m->does_role($role_name);
     }
-    return 0;   
+    return 0;
 };
 
 1;