Mouse::Util::does_role() respects $thing->does() method
[gitmo/Mouse.git] / lib / Mouse / Meta / Method / Destructor.pm
index 5ffcd5c..3611392 100644 (file)
@@ -1,38 +1,50 @@
 package Mouse::Meta::Method::Destructor;
-use Mouse::Util; # enables strict and warnings
+use Mouse::Util qw(:meta); # enables strict and warnings
 
-sub _empty_DESTROY{ }
+use constant _MOUSE_DEBUG => $ENV{MOUSE_DEBUG} ? 1 : 0;
 
 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 .= "${class}::DEMOLISH(\$self);\n";
+            $demolishall .= '                ' . $class
+                . '::DEMOLISH($self, $Mouse::Util::in_global_destruction);'
+                . "\n",
         }
     }
 
-    my $source = sprintf("#line %d %s\n", __LINE__, __FILE__) . <<"...";
-    sub {
-        my \$self = shift;
-        local \$?;
-
-        my \$e = do{
-            local \$@;
+    if($demolishall) {
+        $demolishall = sprintf <<'EOT', $demolishall;
+        my $e = do{
+            local $?;
+            local $@;
             eval{
-                $demolishall;
+                %s;
             };
-            \$@;
+            $@;
         };
         no warnings 'misc';
-        die \$e if \$e; # rethrow
+        die $e if $e; # rethrow
+EOT
     }
-...
+
+    my $name   = $metaclass->name;
+    my $source = sprintf(<<'EOT', __FILE__, $name, $demolishall);
+#line 1 "%s"
+    package %s;
+    sub {
+        my($self) = @_;
+        return $self->Mouse::Object::DESTROY()
+            if ref($self) ne __PACKAGE__;
+        # DEMOLISHALL
+        %s;
+        return;
+    }
+EOT
+
+    warn $source if _MOUSE_DEBUG;
 
     my $code;
     my $e = do{
@@ -53,7 +65,7 @@ Mouse::Meta::Method::Destructor - A Mouse method generator for destructors
 
 =head1 VERSION
 
-This document describes Mouse version 0.40_05
+This document describes Mouse version 0.95
 
 =head1 SEE ALSO