6 use Test::More tests => 43;
11 This tests the more complex
12 delegation cases and that they
13 do not fail at compile time.
22 sub child_a_super_method { "as" }
27 extends "ChildASuper";
29 sub child_a_method_1 { "a1" }
30 sub child_a_method_2 { Scalar::Util::blessed($_[0]) . " a2" }
37 sub child_a_method_3 { "a3" }
42 sub child_b_method_1 { "b1" }
43 sub child_b_method_2 { "b2" }
44 sub child_b_method_3 { "b3" }
49 sub child_c_method_1 { "c1" }
50 sub child_c_method_2 { "c2" }
51 sub child_c_method_3_la { "c3" }
52 sub child_c_method_4_la { "c4" }
57 sub child_d_method_1 { "d1" }
58 sub child_d_method_2 { "d2" }
63 sub new { bless {}, shift }
64 sub child_e_method_1 { "e1" }
65 sub child_e_method_2 { "e2" }
70 sub new { bless {}, shift }
71 sub child_f_method_1 { "f1" }
72 sub child_f_method_2 { "f2" }
77 sub child_g_method_1 { "g1" }
82 sub child_h_method_1 { "h1" }
83 sub parent_method_1 { "child_parent_1" }
88 sub child_i_method_1 { "i1" }
89 sub parent_method_1 { "child_parent_1" }
94 sub parent_method_1 { "parent_1" }
99 default => sub { ChildA->new },
102 } "all_methods requires explicit isa";
108 default => sub { ChildA->new },
111 } "allow all_methods with explicit isa";
116 default => sub { ChildB->new },
117 handles => [qw/child_b_method_1/],
119 } "don't need to declare isa if method list is predefined";
125 default => sub { ChildC->new },
128 } "can declare regex collector";
133 default => sub { ChildD->new },
135 my ( $class, $delegate_class ) = @_;
138 } "can't create attr with generative handles parameter and no isa";
144 default => sub { ChildD->new },
146 my ( $class, $delegate_class ) = @_;
150 } "can't create attr with generative handles parameter and no isa";
156 default => sub { ChildE->new },
157 handles => ["child_e_method_2"],
159 } "can delegate to non moose class using explicit method list";
166 default => sub { ChildF->new },
168 $delegate_class = $_[1]->name;
172 } "subrefs on non moose class give no meta";
174 ::is( $delegate_class, "ChildF", "plain classes are handed down to subs" );
179 default => sub { ChildG->new },
180 handles => ["child_g_method_1"],
182 } "can delegate to object even without explicit reader";
188 default => sub { ChildH->new },
189 handles => sub { map { $_, $_ } $_[1]->get_all_method_names },
191 } "Can't override exisiting class method in delegate";
197 default => sub { ChildI->new },
199 map { $_, $_ } grep { !/^parent_method_1$/ }
200 $_[1]->get_all_method_names;
203 } "Test handles code ref for skipping predefined methods";
206 sub parent_method { "p" }
211 isa_ok( my $p = Parent->new, "Parent" );
212 isa_ok( $p->child_a, "ChildA" );
213 isa_ok( $p->child_b, "ChildB" );
214 isa_ok( $p->child_c, "ChildC" );
215 isa_ok( $p->child_d, "ChildD" );
216 isa_ok( $p->child_e, "ChildE" );
217 isa_ok( $p->child_f, "ChildF" );
218 isa_ok( $p->child_i, "ChildI" );
220 ok(!$p->can('child_g'), '... no child_g accessor defined');
221 ok(!$p->can('child_h'), '... no child_h accessor defined');
224 is( $p->parent_method, "p", "parent method" );
225 is( $p->child_a->child_a_super_method, "as", "child supermethod" );
226 is( $p->child_a->child_a_method_1, "a1", "child method" );
228 can_ok( $p, "child_a_super_method" );
229 can_ok( $p, "child_a_method_1" );
230 can_ok( $p, "child_a_method_2" );
231 ok( !$p->can( "child_a_method_3" ), "but not subclass of delegate class" );
233 is( $p->child_a_method_1, $p->child_a->child_a_method_1, "delegate behaves the same" );
234 is( $p->child_a_method_2, "ChildA a2", "delegates are their own invocants" );
237 can_ok( $p, "child_b_method_1" );
238 ok( !$p->can("child_b_method_2"), "but not ChildB's unspecified siblings" );
241 ok( !$p->can($_), "none of ChildD's methods ($_)" )
242 for grep { /^child/ } map { $_->name } ChildD->meta->get_all_methods();
244 can_ok( $p, "child_c_method_3_la" );
245 can_ok( $p, "child_c_method_4_la" );
247 is( $p->child_c_method_3_la, "c3", "ChildC method delegated OK" );
249 can_ok( $p, "child_e_method_2" );
250 ok( !$p->can("child_e_method_1"), "but not child_e_method_1");
252 is( $p->child_e_method_2, "e2", "delegate to non moose class (child_e_method_2)" );
254 can_ok( $p, "child_g_method_1" );
255 is( $p->child_g_method_1, "g1", "delegate to moose class without reader (child_g_method_1)" );