Merge branch 'master' into blead
[gitmo/Mouse.git] / lib / Mouse / Meta / Method / Destructor.pm
CommitLineData
bbf64e76 1package Mouse::Meta::Method::Destructor;
bc69ee88 2use Mouse::Util; # 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) {
15 no strict 'refs';
c6e5eee1 16 no warnings 'once';
380e1cd7 17 if (*{$class . '::DEMOLISH'}{CODE}) {
18 $demolishall .= "${class}::DEMOLISH(\$self);\n";
bbf64e76 19 }
380e1cd7 20 }
bbf64e76 21
ad087d11 22 my $source = sprintf("#line %d %s\n", __LINE__, __FILE__) . <<"...";
380e1cd7 23 sub {
bbf64e76 24 my \$self = shift;
7746ba36 25 local \$?;
26
27 my \$e = do{
28 local \$@;
29 eval{
30 $demolishall;
31 };
32 \$@;
33 };
34 no warnings 'misc';
35 die \$e if \$e; # rethrow
bbf64e76 36 }
37...
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
54Mouse::Meta::Method::Accessor - A Mouse method generator for destructors
55
56=head1 VERSION
57
034587d8 58This document describes Mouse version 0.40
a25ca8d6 59
60=head1 SEE ALSO
61
62L<Moose::Meta::Method::Destructor>
63
64=cut