6 use Test::More tests => 44;
13 # test no conflicts here
17 sub bar { 'Role::A::bar' }
22 sub xxy { 'Role::B::xxy' }
28 with qw(Role::A Role::B); # no conflict here
31 sub foo { 'Role::C::foo' }
32 sub zot { 'Role::C::zot' }
40 } qr/The Class::A class has implicitly overridden the method \(zot\) from role Role::C\./;
43 sub zot { 'Class::A::zot' }
46 can_ok( Class::A->new, qw(foo bar xxy zot) );
48 is( Class::A->new->foo, "Role::C::foo", "... got the right foo method" );
49 is( Class::A->new->zot, "Class::A::zot", "... got the right zot method" );
50 is( Class::A->new->bar, "Role::A::bar", "... got the right bar method" );
51 is( Class::A->new->xxy, "Role::B::xxy", "... got the right xxy method" );
54 # check that when a role is added to another role
55 # and they conflict and the method they conflicted
56 # with is then required.
58 package Role::A::Conflict;
63 sub bar { 'Role::A::Conflict::bar' }
65 package Class::A::Conflict;
69 with 'Role::A::Conflict';
70 } qr/requires.*'bar'/, '... did not fufill the requirement of &bar method';
72 package Class::A::Resolved;
77 with 'Role::A::Conflict';
78 } qr/The Class::A::Resolved class has implicitly overridden the method \(bar\) from role Role::A::Conflict\./;
79 } '... did fufill the requirement of &bar method';
81 sub bar { 'Class::A::Resolved::bar' }
84 ok(Role::A::Conflict->meta->requires_method('bar'), '... Role::A::Conflict created the bar requirement');
86 can_ok( Class::A::Resolved->new, qw(bar) );
88 is( Class::A::Resolved->new->bar, 'Class::A::Resolved::bar', "... got the right bar method" );
91 # check that when two roles are composed, they conflict
92 # but the composing role can resolve that conflict
97 sub foo { 'Role::D::foo' }
98 sub bar { 'Role::D::bar' }
103 sub foo { 'Role::E::foo' }
104 sub xxy { 'Role::E::xxy' }
110 with qw(Role::D Role::E); # conflict between 'foo's here
111 } "define role Role::F";
113 sub foo { 'Role::F::foo' }
114 sub zot { 'Role::F::zot' }
122 } qr/The Class::B class has implicitly overridden the method \(zot\) from role Role::F\./;
123 } "define class Class::B";
125 sub zot { 'Class::B::zot' }
128 can_ok( Class::B->new, qw(foo bar xxy zot) );
130 is( Class::B->new->foo, "Role::F::foo", "... got the &foo method okay" );
131 is( Class::B->new->zot, "Class::B::zot", "... got the &zot method okay" );
132 is( Class::B->new->bar, "Role::D::bar", "... got the &bar method okay" );
133 is( Class::B->new->xxy, "Role::E::xxy", "... got the &xxy method okay" );
135 ok(!Role::F->meta->requires_method('foo'), '... Role::F fufilled the &foo requirement');
138 # check that a conflict can be resolved
139 # by a role, but also new ones can be
140 # created just as easily ...
142 package Role::D::And::E::Conflict;
146 with qw(Role::D Role::E); # conflict between 'foo's here
147 } "... define role Role::D::And::E::Conflict";
149 sub foo { 'Role::D::And::E::Conflict::foo' } # this overrides ...
152 sub xxy { 'Role::D::And::E::Conflict::xxy' }
153 sub bar { 'Role::D::And::E::Conflict::bar' }
157 ok(!Role::D::And::E::Conflict->meta->requires_method('foo'), '... Role::D::And::E::Conflict fufilled the &foo requirement');
158 ok(Role::D::And::E::Conflict->meta->requires_method('xxy'), '... Role::D::And::E::Conflict adds the &xxy requirement');
159 ok(Role::D::And::E::Conflict->meta->requires_method('bar'), '... Role::D::And::E::Conflict adds the &bar requirement');
162 # conflict propagation
167 sub foo { 'Role::H::foo' }
168 sub bar { 'Role::H::bar' }
173 sub foo { 'Role::J::foo' }
174 sub xxy { 'Role::J::xxy' }
180 with qw(Role::J Role::H); # conflict between 'foo's here
181 } "define role Role::I";
183 sub zot { 'Role::I::zot' }
184 sub zzy { 'Role::I::zzy' }
191 } qr/requires.*'foo'/, "defining class Class::C fails";
193 sub zot { 'Class::C::zot' }
201 } qr/The Class::E class has implicitly overridden the method \(zot\) from role Role::I\./;
202 } "resolved with method";
204 sub foo { 'Class::E::foo' }
205 sub zot { 'Class::E::zot' }
208 can_ok( Class::E->new, qw(foo bar xxy zot) );
210 is( Class::E->new->foo, "Class::E::foo", "... got the right &foo method" );
211 is( Class::E->new->zot, "Class::E::zot", "... got the right &zot method" );
212 is( Class::E->new->bar, "Role::H::bar", "... got the right &bar method" );
213 is( Class::E->new->xxy, "Role::J::xxy", "... got the right &xxy method" );
215 ok(Role::I->meta->requires_method('foo'), '... Role::I still have the &foo requirement');
222 has foo => ( default => __PACKAGE__ . "::foo", is => "rw" );
224 sub zot { 'Class::D::zot' }
228 } qr/The Class::D class has implicitly overridden the method \(zot\) from role Role::I\./;
230 } "resolved with attr";
232 can_ok( Class::D->new, qw(foo bar xxy zot) );
233 is( eval { Class::D->new->bar }, "Role::H::bar", "bar" );
234 is( eval { Class::D->new->zzy }, "Role::I::zzy", "zzy" );
236 is( eval { Class::D->new->foo }, "Class::D::foo", "foo" );
237 is( eval { Class::D->new->zot }, "Class::D::zot", "zot" );