Merge branch 'topic/more-compatible' of gitmo@moose.perl.org:Mouse into topic/more...
[gitmo/Mouse.git] / lib / Mouse / Object.pm
index 2a80b0e..ddcf41f 100644 (file)
@@ -12,7 +12,7 @@ sub new {
 
     my $instance = bless {}, $class;
 
-    for my $attribute ($class->meta->compute_all_applicable_attributes) {
+    for my $attribute ($class->meta->get_all_attributes) {
         my $from = $attribute->init_arg;
         my $key  = $attribute->name;
 
@@ -68,13 +68,9 @@ sub BUILDARGS {
     my $class = shift;
 
     if (scalar @_ == 1) {
-        if (defined $_[0]) {
-            (ref($_[0]) eq 'HASH')
-                || confess "Single parameters to new() must be a HASH ref";
-            return {%{$_[0]}};
-        } else {
-            return {};
-        }
+        (ref($_[0]) eq 'HASH')
+            || confess "Single parameters to new() must be a HASH ref";
+        return {%{$_[0]}};
     }
     else {
         return {@_};
@@ -106,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;
     }
 }