Fix class/role creation
[gitmo/Mouse.git] / lib / Mouse / Meta / Method / Destructor.pm
CommitLineData
bbf64e76 1package Mouse::Meta::Method::Destructor;
2use strict;
3use warnings;
4
2a464664 5sub _empty_destroy{ }
6
7sub _generate_destructor_method {
8 my ($class, $metaclass) = @_;
bbf64e76 9
10 my $demolishall = do {
2a464664 11 if ($metaclass->name->can('DEMOLISH')) {
bbf64e76 12 my @code = ();
2a464664 13 for my $class ($metaclass->linearized_isa) {
7ca5c5fb 14 no strict 'refs';
15 if (*{$class . '::DEMOLISH'}{CODE}) {
16 push @code, "${class}::DEMOLISH(\$self);";
bbf64e76 17 }
18 }
19 join "\n", @code;
20 } else {
2a464664 21 $metaclass->add_method(DESTROY => \&_empty_destroy);
22 return;
bbf64e76 23 }
24 };
25
2a464664 26 my $destructor_name = $metaclass->name . '::DESTROY';
27 my $code = sprintf("#line %d %s\n", __LINE__, __FILE__) . <<"...";
28 sub $destructor_name \{
bbf64e76 29 my \$self = shift;
30 $demolishall;
31 }
32...
bbf64e76 33
2a464664 34 my $e = do{
35 local $@;
36 eval $code;
37 $@;
38 };
bbf64e76 39 die $@ if $@;
2a464664 40 return;
bbf64e76 41}
42
431;