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