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