Commit | Line | Data |
bbf64e76 |
1 | package Mouse::Meta::Method::Destructor; |
2 | use strict; |
3 | use warnings; |
4 | |
5 | sub generate_destructor_method_inline { |
6 | my ($class, $meta) = @_; |
7 | |
8 | my $demolishall = do { |
9 | if ($meta->name->can('DEMOLISH')) { |
10 | my @code = (); |
11 | no strict 'refs'; |
12 | for my $klass ($meta->linearized_isa) { |
13 | if (*{$klass . '::DEMOLISH'}{CODE}) { |
14 | push @code, "${klass}::DEMOLISH(\$self);"; |
15 | } |
16 | } |
17 | join "\n", @code; |
18 | } else { |
0a0814d6 |
19 | return sub { }; # no demolish =) |
bbf64e76 |
20 | } |
21 | }; |
22 | |
23 | my $code = <<"..."; |
24 | sub { |
25 | my \$self = shift; |
26 | $demolishall; |
27 | } |
28 | ... |
bbf64e76 |
29 | |
30 | local $@; |
31 | my $res = eval $code; |
32 | die $@ if $@; |
8da68341 |
33 | return $res; |
bbf64e76 |
34 | } |
35 | |
36 | 1; |