File Coverage

blib/lib/Method/Generate/DemolishAll.pm
Criterion Covered Total %
statement 26 26 100.0
branch n/a
condition n/a
subroutine 9 9 100.0
pod 0 2 0.0
total 35 37 94.5


line stmt bran cond sub pod time code
1             package Method::Generate::DemolishAll;
2 48     48   360 use strict;
  48         106  
  48         1650  
3 48     48   260 use warnings;
  48         98  
  48         1485  
4              
5 48     48   277 use Moo::Object ();
  48         97  
  48         1613  
6 48     48   2173 BEGIN { our @ISA = qw(Moo::Object) }
7 48     48   3938 use Sub::Quote qw(quote_sub quotify);
  48         38990  
  48         3103  
8 48     48   370 use Moo::_Utils qw(_getglob _linear_isa _in_global_destruction_code);
  48         101  
  48         17955  
9              
10             sub generate_method {
11 24     24 0 157 my ($self, $into) = @_;
12 24         105 quote_sub "${into}::DEMOLISHALL", join '',
13             $self->_handle_subdemolish($into),
14             qq{ my \$self = shift;\n},
15             $self->demolishall_body_for($into, '$self', '@_'),
16             qq{ return \$self\n};
17 24         3782 quote_sub "${into}::DESTROY",
18             sprintf <<'END_CODE', $into, _in_global_destruction_code;
19             my $self = shift;
20             my $e;
21             {
22             local $?;
23             local $@;
24             package %s;
25             eval {
26             $self->DEMOLISHALL(%s);
27             1;
28             } or $e = $@;
29             }
30              
31             # fatal warnings+die in DESTROY = bad times (perl rt#123398)
32             no warnings FATAL => 'all';
33             use warnings 'all';
34             die $e if defined $e; # rethrow
35             END_CODE
36             }
37              
38             sub demolishall_body_for {
39 24     24 0 420 my ($self, $into, $me, $args) = @_;
40             my @demolishers =
41 58         154 grep *{_getglob($_)}{CODE},
42             map "${_}::DEMOLISH",
43 24         47 @{_linear_isa($into)};
  24         196  
44 24         268 join '',
45             qq{ package $into;\n},
46             map qq{ ${me}->${_}(${args});\n}, @demolishers;
47             }
48              
49             sub _handle_subdemolish {
50 24     24   59 my ($self, $into) = @_;
51 24         91 ' if (ref($_[0]) ne '.quotify($into).') {'."\n".
52             " package $into;\n".
53             ' return shift->Moo::Object::DEMOLISHALL(@_)'.";\n".
54             ' }'."\n";
55             }
56              
57             1;