6 use Test::More tests => 17;
11 use_ok('Moose::Role');
16 Role which requires a method implemented
17 in another role as an override (it does
18 not remove the requirement)
23 package Role::RequireFoo;
30 package Role::ProvideFoo;
36 with 'Role::RequireFoo';
37 } '... the required "foo" method will not exist yet (but we will live)';
39 override 'foo' => sub { 'Role::ProvideFoo::foo' };
43 [ Role::ProvideFoo->meta->get_required_method_list ],
45 '... foo method is still required for Role::ProvideFoo');
49 Role which requires a method implemented
50 in the consuming class as an override.
51 It will fail since method modifiers are
52 second class citizens.
57 package Class::ProvideFoo::Base;
60 sub foo { 'Class::ProvideFoo::Base::foo' }
62 package Class::ProvideFoo::Override1;
65 extends 'Class::ProvideFoo::Base';
68 with 'Role::RequireFoo';
69 } '... the required "foo" method will not exist yet (and we will die)';
71 override 'foo' => sub { 'Class::ProvideFoo::foo' };
73 package Class::ProvideFoo::Override2;
76 extends 'Class::ProvideFoo::Base';
78 override 'foo' => sub { 'Class::ProvideFoo::foo' };
81 with 'Role::RequireFoo';
82 } '... the required "foo" method exists, but it is an override (and we will die)';
88 Now same thing, but with a before
94 package Class::ProvideFoo::Before1;
97 extends 'Class::ProvideFoo::Base';
100 with 'Role::RequireFoo';
101 } '... the required "foo" method will not exist yet (and we will die)';
103 before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
105 package Class::ProvideFoo::Before2;
108 extends 'Class::ProvideFoo::Base';
110 before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
113 with 'Role::RequireFoo';
114 } '... the required "foo" method exists, but it is a before (and we will die)';
116 package Class::ProvideFoo::Before3;
119 extends 'Class::ProvideFoo::Base';
122 with 'Role::RequireFoo';
123 } '... the required "foo" method will not exist yet (and we will die)';
125 sub foo { 'Class::ProvideFoo::foo' }
126 before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
128 package Class::ProvideFoo::Before4;
131 extends 'Class::ProvideFoo::Base';
133 sub foo { 'Class::ProvideFoo::foo' }
134 before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
136 ::isa_ok(__PACKAGE__->meta->get_method('foo'), 'Class::MOP::Method::Wrapped');
137 ::is(__PACKAGE__->meta->get_method('foo')->get_original_method->package_name, __PACKAGE__,
138 '... but the original method is from our package');
141 with 'Role::RequireFoo';
142 } '... the required "foo" method exists in the symbol table (and we will live)';
144 package Class::ProvideFoo::Before5;
147 extends 'Class::ProvideFoo::Base';
149 before 'foo' => sub { 'Class::ProvideFoo::foo:before' };
151 ::isa_ok(__PACKAGE__->meta->get_method('foo'), 'Class::MOP::Method::Wrapped');
152 ::isnt(__PACKAGE__->meta->get_method('foo')->get_original_method->package_name, __PACKAGE__,
153 '... but the original method is not from our package');
156 with 'Role::RequireFoo';
157 } '... the required "foo" method exists, but it is a before wrapping the super (and we will die)';
162 Now same thing, but with a method from an attribute
169 package Class::ProvideFoo::Attr1;
172 extends 'Class::ProvideFoo::Base';
175 with 'Role::RequireFoo';
176 } '... the required "foo" method will not exist yet (and we will die)';
178 has 'foo' => (is => 'ro');
180 package Class::ProvideFoo::Attr2;
183 extends 'Class::ProvideFoo::Base';
185 has 'foo' => (is => 'ro');
188 with 'Role::RequireFoo';
189 } '... the required "foo" method exists, but it is a before (and we will die)';