Switch to Mouse::Exporter
[gitmo/Mouse.git] / lib / Mouse / Meta / Method / Destructor.pm
index 623e7d7..783e6d3 100644 (file)
@@ -1,37 +1,42 @@
 package Mouse::Meta::Method::Destructor;
-use strict;
-use warnings;
+use Mouse::Util; # enables strict and warnings
 
-sub generate_destructor_method_inline {
-    my ($class, $meta) = @_;
+sub _empty_destroy{ }
+
+sub _generate_destructor_method {
+    my ($class, $metaclass) = @_;
 
     my $demolishall = do {
-        if ($meta->name->can('DEMOLISH')) {
+        if ($metaclass->name->can('DEMOLISH')) {
             my @code = ();
-            no strict 'refs';
-            for my $klass ($meta->linearized_isa) {
-                if (*{$klass . '::DEMOLISH'}{CODE}) {
-                    push @code, "${klass}::DEMOLISH(\$self);";
+            for my $class ($metaclass->linearized_isa) {
+                no strict 'refs';
+                if (*{$class . '::DEMOLISH'}{CODE}) {
+                    push @code, "${class}::DEMOLISH(\$self);";
                 }
             }
             join "\n", @code;
         } else {
-            ''; # no demolish =)
+            $metaclass->add_method(DESTROY => \&_empty_destroy);
+            return;
         }
     };
 
-    my $code = <<"...";
-    sub {
+    my $destructor_name = $metaclass->name . '::DESTROY';
+    my $source = sprintf("#line %d %s\n", __LINE__, __FILE__) . <<"...";
+    sub $destructor_name \{
         my \$self = shift;
         $demolishall;
     }
 ...
-    warn $code if $ENV{DEBUG};
 
-    local $@;
-    my $res = eval $code;
-    die $@ if $@;
-    $res;
+    my $e = do{
+        local $@;
+        eval $source;
+        $@;
+    };
+    die $e if $e;
+    return;
 }
 
 1;