From: Dave Rolsky Date: Wed, 13 May 2009 16:08:47 +0000 (-0500) Subject: At least try to get the inheritance chain from a metaclass object X-Git-Tag: 0.79~2 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=2bc1eab64fa2af8be1a1057c20e29782ae5a321e;p=gitmo%2FMoose.git At least try to get the inheritance chain from a metaclass object before falling back to mro::get_linear_isa. --- diff --git a/lib/Moose/Object.pm b/lib/Moose/Object.pm index 6c5ffdf..6828a65 100644 --- a/lib/Moose/Object.pm +++ b/lib/Moose/Object.pm @@ -65,12 +65,19 @@ sub DEMOLISHALL { # extra meta level calls return unless $self->can('DEMOLISH'); - # 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; - foreach my $class ( @{ mro::get_linear_isa($class_name) } ) { + my @isa; + if ( my $meta = Class::MOP::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 = @{ mro::get_linear_isa($class_name) } + } + + foreach my $class (@isa) { no strict 'refs'; my $demolish = *{"${class}::DEMOLISH"}{CODE}; $self->$demolish($in_global_destruction)