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