our %NO_BUILD;
our $BUILD_MAKER;
+our $DEMOLISH_MAKER;
sub new {
my $class = shift;
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);
};
$@;
};
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;