X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoo%2FObject.pm;h=06a86f970779377287d865edd24dda35277ceb23;hb=56ffe19d51215674fb162c30ba9c5dc1951402c5;hp=1b26821878f0e1c302ba195c7ee08d0162e82826;hpb=c2cc003f41aa57bf01dcde5b6cab28abb064b2bf;p=gitmo%2FRole-Tiny.git diff --git a/lib/Moo/Object.pm b/lib/Moo/Object.pm index 1b26821..06a86f9 100644 --- a/lib/Moo/Object.pm +++ b/lib/Moo/Object.pm @@ -4,6 +4,7 @@ use strictures 1; our %NO_BUILD; our $BUILD_MAKER; +our $DEMOLISH_MAKER; sub new { my $class = shift; @@ -58,16 +59,7 @@ sub DESTROY { eval { # DEMOLISHALL - # 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 ;) - - foreach my $class (@{ Moo::_Utils::_get_linear_isa(ref $self) }) { - my $demolish = $class->can('DEMOLISH') || next; - - $self->$demolish($Moo::_Utils::_in_global_destruction); - } + $self->DEMOLISHALL($Moo::_Utils::_in_global_destruction); }; $@; }; @@ -76,7 +68,13 @@ sub DESTROY { die $e if $e; # rethrow } - +sub DEMOLISHALL { + my $self = shift; + $self->${\(($DEMOLISH_MAKER ||= do { + require Method::Generate::DemolishAll; + Method::Generate::DemolishAll->new + })->generate_method(ref($self)))}(@_); +} sub does { require Role::Tiny;