clean up ::Destructor
[gitmo/Moose.git] / t / 020_attributes / 011_more_attr_delegation.t
index f331a05..050ec3d 100644 (file)
@@ -3,13 +3,13 @@
 use strict;
 use warnings;
 
-use Test::More tests => 39;
-use Test::Exception;
+use Test::More;
+use Test::Fatal;
 
 =pod
 
-This tests the more complex 
-delegation cases and that they 
+This tests the more complex
+delegation cases and that they
 do not fail at compile time.
 
 =cut
@@ -76,44 +76,59 @@ do not fail at compile time.
 
     sub child_g_method_1 { "g1" }
 
+    package ChildH;
+    use Moose;
+
+    sub child_h_method_1 { "h1" }
+    sub parent_method_1 { "child_parent_1" }
+
+    package ChildI;
+    use Moose;
+
+    sub child_i_method_1 { "i1" }
+    sub parent_method_1 { "child_parent_1" }
+
     package Parent;
     use Moose;
 
-    ::dies_ok {
+    sub parent_method_1 { "parent_1" }
+    ::can_ok('Parent', 'parent_method_1');
+
+    ::isnt( ::exception {
         has child_a => (
             is      => "ro",
             default => sub { ChildA->new },
             handles => qr/.*/,
         );
-    } "all_methods requires explicit isa";
+    }, undef, "all_methods requires explicit isa" );
 
-    ::lives_ok {
+    ::is( ::exception {
         has child_a => (
             isa     => "ChildA",
             is      => "ro",
             default => sub { ChildA->new },
             handles => qr/.*/,
         );
-    } "allow all_methods with explicit isa";
+    }, undef, "allow all_methods with explicit isa" );
 
-    ::lives_ok {
+    ::is( ::exception {
         has child_b => (
             is      => 'ro',
             default => sub { ChildB->new },
             handles => [qw/child_b_method_1/],
         );
-    } "don't need to declare isa if method list is predefined";
+    }, undef, "don't need to declare isa if method list is predefined" );
 
-    ::lives_ok {
+    ::is( ::exception {
         has child_c => (
             isa     => "ChildC",
             is      => "ro",
             default => sub { ChildC->new },
             handles => qr/_la$/,
         );
-    } "can declare regex collector";
+    }, undef, "can declare regex collector" );
 
-    ::dies_ok {
+    ::isnt( ::exception {
         has child_d => (
             is      => "ro",
             default => sub { ChildD->new },
@@ -121,9 +136,9 @@ do not fail at compile time.
                 my ( $class, $delegate_class ) = @_;
             }
         );
-    } "can't create attr with generative handles parameter and no isa";
+    }, undef, "can't create attr with generative handles parameter and no isa" );
 
-    ::lives_ok {
+    ::is( ::exception {
         has child_d => (
             isa     => "ChildD",
             is      => "ro",
@@ -133,19 +148,19 @@ do not fail at compile time.
                 return;
             }
         );
-    } "can't create attr with generative handles parameter and no isa";
+    }, undef, "can't create attr with generative handles parameter and no isa" );
 
-    ::lives_ok {
+    ::is( ::exception {
         has child_e => (
             isa     => "ChildE",
             is      => "ro",
             default => sub { ChildE->new },
             handles => ["child_e_method_2"],
         );
-    } "can delegate to non moose class using explicit method list";
+    }, undef, "can delegate to non moose class using explicit method list" );
 
     my $delegate_class;
-    ::lives_ok {
+    ::is( ::exception {
         has child_f => (
             isa     => "ChildF",
             is      => "ro",
@@ -155,17 +170,41 @@ do not fail at compile time.
                 return;
             },
         );
-    } "subrefs on non moose class give no meta";
+    }, undef, "subrefs on non moose class give no meta" );
 
     ::is( $delegate_class, "ChildF", "plain classes are handed down to subs" );
-    
-    ::lives_ok {
+
+    ::is( ::exception {
         has child_g => (
             isa     => "ChildG",
             default => sub { ChildG->new },
             handles => ["child_g_method_1"],
         );
-    } "can delegate to object even without explicit reader";    
+    }, undef, "can delegate to object even without explicit reader" );
+
+    ::can_ok('Parent', 'parent_method_1');
+    ::isnt( ::exception {
+        has child_h => (
+            isa     => "ChildH",
+            is      => "ro",
+            default => sub { ChildH->new },
+            handles => sub { map { $_, $_ } $_[1]->get_all_method_names },
+        );
+    }, undef, "Can't override exisiting class method in delegate" );
+    ::can_ok('Parent', 'parent_method_1');
+
+    ::is( ::exception {
+        has child_i => (
+            isa     => "ChildI",
+            is      => "ro",
+            default => sub { ChildI->new },
+            handles => sub {
+                map { $_, $_ } grep { !/^parent_method_1|meta$/ }
+                    $_[1]->get_all_method_names;
+            },
+        );
+    }, undef, "Test handles code ref for skipping predefined methods" );
+
 
     sub parent_method { "p" }
 }
@@ -179,8 +218,10 @@ isa_ok( $p->child_c, "ChildC" );
 isa_ok( $p->child_d, "ChildD" );
 isa_ok( $p->child_e, "ChildE" );
 isa_ok( $p->child_f, "ChildF" );
+isa_ok( $p->child_i, "ChildI" );
 
 ok(!$p->can('child_g'), '... no child_g accessor defined');
+ok(!$p->can('child_h'), '... no child_h accessor defined');
 
 
 is( $p->parent_method, "p", "parent method" );
@@ -201,7 +242,7 @@ ok( !$p->can("child_b_method_2"), "but not ChildB's unspecified siblings" );
 
 
 ok( !$p->can($_), "none of ChildD's methods ($_)" )
-    for grep { /^child/ } map { $_->{name} } ChildD->meta->compute_all_applicable_methods();
+    for grep { /^child/ } map { $_->name } ChildD->meta->get_all_methods();
 
 can_ok( $p, "child_c_method_3_la" );
 can_ok( $p, "child_c_method_4_la" );
@@ -215,3 +256,8 @@ is( $p->child_e_method_2, "e2", "delegate to non moose class (child_e_method_2)"
 
 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" );
+is( $p->parent_method_1, "parent_1", "delegate doesn't override existing method" );
+
+done_testing;