Move method modifier manipulators into XS
[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
ad087d11 21 my $source = sprintf("#line %d %s\n", __LINE__, __FILE__) . <<"...";
380e1cd7 22 sub {
bbf64e76 23 my \$self = shift;
7746ba36 24 local \$?;
25
26 my \$e = do{
27 local \$@;
28 eval{
29 $demolishall;
30 };
31 \$@;
32 };
33 no warnings 'misc';
34 die \$e if \$e; # rethrow
bbf64e76 35 }
36...
bbf64e76 37
380e1cd7 38 my $code;
2a464664 39 my $e = do{
40 local $@;
380e1cd7 41 $code = eval $source;
2a464664 42 $@;
43 };
ad087d11 44 die $e if $e;
380e1cd7 45 return $code;
bbf64e76 46}
47
481;
0126c27c 49__END__
a25ca8d6 50
51=head1 NAME
52
b842ace0 53Mouse::Meta::Method::Destructor - A Mouse method generator for destructors
a25ca8d6 54
55=head1 VERSION
56
4bc73e47 57This document describes Mouse version 0.50_03
a25ca8d6 58
59=head1 SEE ALSO
60
61L<Moose::Meta::Method::Destructor>
62
63=cut