Fix RT #50422
gfx [Tue, 13 Oct 2009 07:38:21 +0000 (16:38 +0900)]
lib/Mouse/Meta/Method/Destructor.pm
lib/Mouse/Meta/Module.pm
lib/Mouse/Object.pm

index 60cc49e..a2941b3 100644 (file)
@@ -13,6 +13,7 @@ sub _generate_destructor{
     my $demolishall = '';
     for my $class ($metaclass->linearized_isa) {
         no strict 'refs';
+        no warnings 'once';
         if (*{$class . '::DEMOLISH'}{CODE}) {
             $demolishall .= "${class}::DEMOLISH(\$self);\n";
         }
index 9ba54f6..15583d9 100755 (executable)
@@ -91,7 +91,7 @@ sub add_method {
 
     my $pkg = $self->name;
     no strict 'refs';
-    no warnings 'redefine';
+    no warnings 'redefine', 'once';
     *{ $pkg . '::' . $name } = $code;
 }
 
@@ -118,6 +118,7 @@ sub has_method {
 
     my $code = do{
         no strict 'refs';
+        no warnings 'once';
         *{ $self->{package} . '::' . $method_name }{CODE};
     };
 
@@ -131,7 +132,11 @@ sub get_method_body{
         or $self->throw_error('You must define a method name');
 
     return $self->{methods}{$method_name} ||= do{
-        my $code = do{ no strict 'refs'; *{$self->{package} . '::' . $method_name}{CODE} };
+        my $code = do{
+            no strict 'refs';
+            no warnings 'once';
+            *{$self->{package} . '::' . $method_name}{CODE};
+        };
 
         ($code && $self->_code_is_mine($code)) ? $code : undef;
     };
index 20748e9..feef5cb 100644 (file)
@@ -51,8 +51,11 @@ sub BUILDALL {
     return unless $self->can('BUILD');
 
     for my $class (reverse $self->meta->linearized_isa) {
-        my $build = do{ no strict 'refs'; *{ $class . '::BUILD' }{CODE} }
-            or next;
+        my $build = do{
+            no strict 'refs';
+            no warnings 'once';
+            *{ $class . '::BUILD' }{CODE};
+        } or next;
 
         $self->$build(@_);
     }
@@ -71,8 +74,11 @@ sub DEMOLISHALL {
     # that time (at least tests suggest so ;)
 
     foreach my $class (@{ Mouse::Util::get_linear_isa(ref $self) }) {
-        my $demolish = do{ no strict 'refs'; *{ $class . '::DEMOLISH'}{CODE} }
-            or next;
+        my $demolish = do{
+            no strict 'refs';
+            no warnings 'once';
+            *{ $class . '::DEMOLISH'}{CODE};
+        } or next;
 
         $self->$demolish();
     }