Commit | Line | Data |
---|---|---|
bbf64e76 | 1 | package Mouse::Meta::Method::Destructor; |
3821b191 | 2 | use Mouse::Util qw(:meta); # 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) { | |
a5c683f6 | 15 | if (Mouse::Util::get_code_ref($class, 'DEMOLISH')) { |
6514735e | 16 | $demolishall .= sprintf "%s::DEMOLISH(\$self, \$Mouse::Util::in_global_destruction);\n", |
17 | $class, | |
bbf64e76 | 18 | } |
380e1cd7 | 19 | } |
bbf64e76 | 20 | |
70a92220 | 21 | my $source = sprintf(<<'END_DESTROY', __LINE__, __FILE__, $demolishall); |
22 | #line %d %s | |
380e1cd7 | 23 | sub { |
70a92220 | 24 | my $self = shift; |
25 | my $e = do{ | |
26 | local $?; | |
27 | local $@; | |
7746ba36 | 28 | eval{ |
70a92220 | 29 | # demolishall |
30 | %s; | |
7746ba36 | 31 | }; |
70a92220 | 32 | $@; |
7746ba36 | 33 | }; |
34 | no warnings 'misc'; | |
70a92220 | 35 | die $e if $e; # rethrow |
bbf64e76 | 36 | } |
70a92220 | 37 | END_DESTROY |
bbf64e76 | 38 | |
380e1cd7 | 39 | my $code; |
2a464664 | 40 | my $e = do{ |
41 | local $@; | |
380e1cd7 | 42 | $code = eval $source; |
2a464664 | 43 | $@; |
44 | }; | |
ad087d11 | 45 | die $e if $e; |
380e1cd7 | 46 | return $code; |
bbf64e76 | 47 | } |
48 | ||
49 | 1; | |
0126c27c | 50 | __END__ |
a25ca8d6 | 51 | |
52 | =head1 NAME | |
53 | ||
b842ace0 | 54 | Mouse::Meta::Method::Destructor - A Mouse method generator for destructors |
a25ca8d6 | 55 | |
56 | =head1 VERSION | |
57 | ||
98a8fd12 | 58 | This document describes Mouse version 0.50_05 |
a25ca8d6 | 59 | |
60 | =head1 SEE ALSO | |
61 | ||
62 | L<Moose::Meta::Method::Destructor> | |
63 | ||
64 | =cut |