don't remove accessors we never installed
Jesse Luehrs [Sat, 24 Oct 2009 18:42:38 +0000 (13:42 -0500)]
Changes
lib/Moose/Meta/Attribute.pm
t/020_attributes/011_more_attr_delegation.t

diff --git a/Changes b/Changes
index 763fbd2..22a4aa8 100644 (file)
--- a/Changes
+++ b/Changes
@@ -23,6 +23,10 @@ for, noteworthy changes.
         main package. This applied to Moose and Moose::Role, among
         others. (nothingmuch)
 
+    * Moose::Meta::Attribute
+      - Don't remove attribute accessors we never installed, during
+        remove_accessors. (doy)
+
 0.92 Tue, Sep 22, 2009
     * Moose::Util::TypeConstraints
       - added the match_on_type operator (Stevan)
index 55cb2c6..7490320 100644 (file)
@@ -5,6 +5,7 @@ use strict;
 use warnings;
 
 use Scalar::Util 'blessed', 'weaken';
+use List::MoreUtils 'any';
 use Try::Tiny;
 use overload     ();
 
@@ -657,6 +658,7 @@ sub remove_delegation {
     my %handles = $self->_canonicalize_handles;
     my $associated_class = $self->associated_class;
     foreach my $handle (keys %handles) {
+        next unless any { $handle eq $_ } $self->associated_methods;
         $self->associated_class->remove_method($handle);
     }
 }
index 55a9212..34fdb45 100644 (file)
@@ -191,9 +191,7 @@ do not fail at compile time.
             handles => sub { map { $_, $_ } $_[1]->get_all_method_names },
         );
     } "Can't override exisiting class method in delegate";
-    { our $TODO; local $TODO = 'if add_attribute dies because a delegate would have overridden a local method, the rollback code removes the original method';
     ::can_ok('Parent', 'parent_method_1');
-    }
 
     ::lives_ok {
         has child_i => (
@@ -201,7 +199,7 @@ do not fail at compile time.
             is      => "ro",
             default => sub { ChildI->new },
             handles => sub {
-                map { $_, $_ } grep { !/^parent_method_1$/ }
+                map { $_, $_ } grep { !/^parent_method_1|meta$/ }
                     $_[1]->get_all_method_names;
             },
         );
@@ -260,6 +258,4 @@ can_ok( $p, "child_g_method_1" );
 is( $p->child_g_method_1, "g1", "delegate to moose class without reader (child_g_method_1)" );
 
 can_ok( $p, "child_i_method_1" );
-{ local $TODO = 'if add_attribute dies because a delegate would have overridden a local method, the rollback code removes the original method';
-lives_and { is( $p->parent_method_1, "parent_1", "delegate doesn't override existing method" ) };
-}
+is( $p->parent_method_1, "parent_1", "delegate doesn't override existing method" );