Switch to Mouse::Exporter
[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_method {
7     my ($class, $metaclass) = @_;
8
9     my $demolishall = do {
10         if ($metaclass->name->can('DEMOLISH')) {
11             my @code = ();
12             for my $class ($metaclass->linearized_isa) {
13                 no strict 'refs';
14                 if (*{$class . '::DEMOLISH'}{CODE}) {
15                     push @code, "${class}::DEMOLISH(\$self);";
16                 }
17             }
18             join "\n", @code;
19         } else {
20             $metaclass->add_method(DESTROY => \&_empty_destroy);
21             return;
22         }
23     };
24
25     my $destructor_name = $metaclass->name . '::DESTROY';
26     my $source = sprintf("#line %d %s\n", __LINE__, __FILE__) . <<"...";
27     sub $destructor_name \{
28         my \$self = shift;
29         $demolishall;
30     }
31 ...
32
33     my $e = do{
34         local $@;
35         eval $source;
36         $@;
37     };
38     die $e if $e;
39     return;
40 }
41
42 1;