diff --git a/lib/Moose/Object.pm b/lib/Moose/Object.pm index 3e6c4fa47..69c471bf4 100644 --- a/lib/Moose/Object.pm +++ b/lib/Moose/Object.pm @@ -78,6 +78,8 @@ sub DEMOLISHALL { foreach my $class (@isa) { no strict 'refs'; + # If a child module implements DEMOLISH and its parent does not + # then the access below can be the only reference to that parent's sub my $demolish = do { no warnings 'once'; *{"${class}::DEMOLISH"}{CODE}; diff --git a/t/bugs/DEMOLISH_warnings.t b/t/bugs/DEMOLISH_warnings.t index 0db745374..3a9de3ff9 100644 --- a/t/bugs/DEMOLISH_warnings.t +++ b/t/bugs/DEMOLISH_warnings.t @@ -2,14 +2,8 @@ use strict; use warnings; use lib 't/lib'; -use Test::More tests => 1; - -my @warnings; -BEGIN { - $SIG{__WARN__} = sub { push @warnings, @_ }; -} +use Test::More tests => 2; # Test::Warnings re-tests had_no_warnings implicitly +use Test::Requires qw(Test::Warnings); use Demolition::OnceRemoved; - -is scalar @warnings, 0, "No warnings" - or diag explain \@warnings; +Test::Warnings::had_no_warnings("No DEMOLISH warnings"); diff --git a/t/lib/Demolition/OnceRemoved.pm b/t/lib/Demolition/OnceRemoved.pm index 217f95af5..c7f2e3b8f 100644 --- a/t/lib/Demolition/OnceRemoved.pm +++ b/t/lib/Demolition/OnceRemoved.pm @@ -3,7 +3,9 @@ use strict; use warnings; use Demolition::Demolisher; +# This variable is only in scope during the initial `use` +# As it leaves scope, Perl will call DESTROY on it +# (and Moose::Object will then go through its DEMOLISHALL method) my $d = Demolition::Demolisher->new; -$d->DEMOLISH; 1;