Skip threading tests on Test::More 2.00_01
[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 _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 35EOT
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
471;
0126c27c 48__END__
a25ca8d6 49
50=head1 NAME
51
b842ace0 52Mouse::Meta::Method::Destructor - A Mouse method generator for destructors
a25ca8d6 53
54=head1 VERSION
55
b0d52f03 56This document describes Mouse version 0.73
a25ca8d6 57
58=head1 SEE ALSO
59
60L<Moose::Meta::Method::Destructor>
61
62=cut