Tidy for release
[gitmo/Mouse.git] / lib / Mouse / Meta / Method / Destructor.pm
1 package Mouse::Meta::Method::Destructor;
2 use Mouse::Util; # enables strict and warnings
3
4 sub _empty_DESTROY{ }
5
6 sub _generate_destructor{
7     my (undef, $metaclass) = @_;
8
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';
16         if (*{$class . '::DEMOLISH'}{CODE}) {
17             $demolishall .= "${class}::DEMOLISH(\$self);\n";
18         }
19     }
20
21     my $source = sprintf("#line %d %s\n", __LINE__, __FILE__) . <<"...";
22     sub {
23         my \$self = shift;
24         $demolishall;
25     }
26 ...
27
28     my $code;
29     my $e = do{
30         local $@;
31         $code = eval $source;
32         $@;
33     };
34     die $e if $e;
35     return $code;
36 }
37
38 1;
39 __END__