Tenative switch to a generated DEMOLISHALL - see rest of message for caveats
[gitmo/Role-Tiny.git] / lib / Moo / Object.pm
index 1b26821..06a86f9 100644 (file)
@@ -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;