Tidy _generate_destructor
[gitmo/Mouse.git] / lib / Mouse / Meta / Method / Destructor.pm
index 783e6d3..db96642 100644 (file)
@@ -1,42 +1,64 @@
 package Mouse::Meta::Method::Destructor;
-use Mouse::Util; # enables strict and warnings
-
-sub _empty_destroy{ }
-
-sub _generate_destructor_method {
-    my ($class, $metaclass) = @_;
-
-    my $demolishall = do {
-        if ($metaclass->name->can('DEMOLISH')) {
-            my @code = ();
-            for my $class ($metaclass->linearized_isa) {
-                no strict 'refs';
-                if (*{$class . '::DEMOLISH'}{CODE}) {
-                    push @code, "${class}::DEMOLISH(\$self);";
-                }
-            }
-            join "\n", @code;
-        } else {
-            $metaclass->add_method(DESTROY => \&_empty_destroy);
-            return;
+use Mouse::Util qw(:meta); # enables strict and warnings
+
+sub _empty_DESTROY{ }
+
+sub _generate_destructor{
+    my (undef, $metaclass) = @_;
+
+    if(!$metaclass->name->can('DEMOLISH')){
+        return \&_empty_DESTROY;
+    }
+
+    my $demolishall = '';
+    for my $class ($metaclass->linearized_isa) {
+        if (Mouse::Util::get_code_ref($class, 'DEMOLISH')) {
+            $demolishall .= sprintf "%s::DEMOLISH(\$self, \$Mouse::Util::in_global_destruction);\n",
+                $class,
         }
-    };
+    }
 
-    my $destructor_name = $metaclass->name . '::DESTROY';
-    my $source = sprintf("#line %d %s\n", __LINE__, __FILE__) . <<"...";
-    sub $destructor_name \{
-        my \$self = shift;
-        $demolishall;
+    my $source = sprintf(<<'END_DESTROY', __LINE__, __FILE__, $demolishall);
+#line %d %s
+    sub {
+        my $self = shift;
+        my $e = do{
+            local $?;
+            local $@;
+            eval{
+                # demolishall
+                %s;
+            };
+            $@;
+        };
+        no warnings 'misc';
+        die $e if $e; # rethrow
     }
-...
+END_DESTROY
 
+    my $code;
     my $e = do{
         local $@;
-        eval $source;
+        $code = eval $source;
         $@;
     };
     die $e if $e;
-    return;
+    return $code;
 }
 
 1;
+__END__
+
+=head1 NAME
+
+Mouse::Meta::Method::Destructor - A Mouse method generator for destructors
+
+=head1 VERSION
+
+This document describes Mouse version 0.50_03
+
+=head1 SEE ALSO
+
+L<Moose::Meta::Method::Destructor>
+
+=cut