Commit | Line | Data |
---|---|---|
bbf64e76 | 1 | package Mouse::Meta::Method::Destructor; |
2 | use strict; | |
3 | use warnings; | |
4 | ||
2a464664 | 5 | sub _empty_destroy{ } |
6 | ||
7 | sub _generate_destructor_method { | |
8 | my ($class, $metaclass) = @_; | |
bbf64e76 | 9 | |
10 | my $demolishall = do { | |
2a464664 | 11 | if ($metaclass->name->can('DEMOLISH')) { |
bbf64e76 | 12 | my @code = (); |
2a464664 | 13 | for my $class ($metaclass->linearized_isa) { |
7ca5c5fb | 14 | no strict 'refs'; |
15 | if (*{$class . '::DEMOLISH'}{CODE}) { | |
16 | push @code, "${class}::DEMOLISH(\$self);"; | |
bbf64e76 | 17 | } |
18 | } | |
19 | join "\n", @code; | |
20 | } else { | |
2a464664 | 21 | $metaclass->add_method(DESTROY => \&_empty_destroy); |
22 | return; | |
bbf64e76 | 23 | } |
24 | }; | |
25 | ||
2a464664 | 26 | my $destructor_name = $metaclass->name . '::DESTROY'; |
ad087d11 | 27 | my $source = sprintf("#line %d %s\n", __LINE__, __FILE__) . <<"..."; |
2a464664 | 28 | sub $destructor_name \{ |
bbf64e76 | 29 | my \$self = shift; |
30 | $demolishall; | |
31 | } | |
32 | ... | |
bbf64e76 | 33 | |
2a464664 | 34 | my $e = do{ |
35 | local $@; | |
ad087d11 | 36 | eval $source; |
2a464664 | 37 | $@; |
38 | }; | |
ad087d11 | 39 | die $e if $e; |
2a464664 | 40 | return; |
bbf64e76 | 41 | } |
42 | ||
43 | 1; |