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 _generate_destructor{ |
5 | my (undef, $metaclass) = @_; | |
bbf64e76 | 6 | |
380e1cd7 | 7 | my $demolishall = ''; |
8 | for my $class ($metaclass->linearized_isa) { | |
a5c683f6 | 9 | if (Mouse::Util::get_code_ref($class, 'DEMOLISH')) { |
6514735e | 10 | $demolishall .= sprintf "%s::DEMOLISH(\$self, \$Mouse::Util::in_global_destruction);\n", |
11 | $class, | |
bbf64e76 | 12 | } |
380e1cd7 | 13 | } |
bbf64e76 | 14 | |
b17191d0 | 15 | my $name = $metaclass->name; |
16 | my $source = sprintf(<<'EOT', __LINE__, __FILE__, $name, $demolishall); | |
70a92220 | 17 | #line %d %s |
b17191d0 | 18 | package %s; |
380e1cd7 | 19 | sub { |
70a92220 | 20 | my $self = shift; |
b17191d0 | 21 | return $self->Mouse::Object::DESTROY() |
22 | if ref($self) ne __PACKAGE__; | |
70a92220 | 23 | my $e = do{ |
24 | local $?; | |
25 | local $@; | |
7746ba36 | 26 | eval{ |
70a92220 | 27 | # demolishall |
28 | %s; | |
7746ba36 | 29 | }; |
70a92220 | 30 | $@; |
7746ba36 | 31 | }; |
32 | no warnings 'misc'; | |
70a92220 | 33 | die $e if $e; # rethrow |
bbf64e76 | 34 | } |
b17191d0 | 35 | EOT |
bbf64e76 | 36 | |
380e1cd7 | 37 | my $code; |
2a464664 | 38 | my $e = do{ |
39 | local $@; | |
380e1cd7 | 40 | $code = eval $source; |
2a464664 | 41 | $@; |
42 | }; | |
ad087d11 | 43 | die $e if $e; |
380e1cd7 | 44 | return $code; |
bbf64e76 | 45 | } |
46 | ||
47 | 1; | |
0126c27c | 48 | __END__ |
a25ca8d6 | 49 | |
50 | =head1 NAME | |
51 | ||
b842ace0 | 52 | Mouse::Meta::Method::Destructor - A Mouse method generator for destructors |
a25ca8d6 | 53 | |
54 | =head1 VERSION | |
55 | ||
01d4f728 | 56 | This document describes Mouse version 0.72 |
a25ca8d6 | 57 | |
58 | =head1 SEE ALSO | |
59 | ||
60 | L<Moose::Meta::Method::Destructor> | |
61 | ||
62 | =cut |