Add get_read_method_ref and get_write_method_ref. Remove get_read_method and get_writ...
[gitmo/Mouse.git] / lib / Mouse / Meta / Method / Destructor.pm
index fa0d025..c3d2a0d 100644 (file)
@@ -2,13 +2,15 @@ package Mouse::Meta::Method::Destructor;
 use strict;
 use 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 = ();
-            for my $class ($meta->linearized_isa) {
+            for my $class ($metaclass->linearized_isa) {
                 no strict 'refs';
                 if (*{$class . '::DEMOLISH'}{CODE}) {
                     push @code, "${class}::DEMOLISH(\$self);";
@@ -16,21 +18,26 @@ sub generate_destructor_method_inline {
             }
             join "\n", @code;
         } else {
-            return sub { }; # no demolish =)
+            $metaclass->add_method(DESTROY => \&_empty_destroy);
+            return;
         }
     };
 
-    my $code = <<"...";
-    sub {
+    my $destructor_name = $metaclass->name . '::DESTROY';
+    my $code = sprintf("#line %d %s\n", __LINE__, __FILE__) . <<"...";
+    sub $destructor_name \{
         my \$self = shift;
         $demolishall;
     }
 ...
 
-    local $@;
-    my $res = eval $code;
+    my $e = do{
+        local $@;
+        eval $code;
+        $@;
+    };
     die $@ if $@;
-    return $res;
+    return;
 }
 
 1;