Checking in changes prior to tagging of version 0.50_04. Changelog diff is:
[gitmo/Mouse.git] / lib / Mouse / Meta / Method / Destructor.pm
CommitLineData
bbf64e76 1package Mouse::Meta::Method::Destructor;
3821b191 2use Mouse::Util qw(:meta); # enables strict and warnings
bbf64e76 3
380e1cd7 4sub _empty_DESTROY{ }
2a464664 5
380e1cd7 6sub _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 37END_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
491;
0126c27c 50__END__
a25ca8d6 51
52=head1 NAME
53
b842ace0 54Mouse::Meta::Method::Destructor - A Mouse method generator for destructors
a25ca8d6 55
56=head1 VERSION
57
c2168931 58This document describes Mouse version 0.50_04
a25ca8d6 59
60=head1 SEE ALSO
61
62L<Moose::Meta::Method::Destructor>
63
64=cut