10 package Foo::Trait::Class;
13 around _inline_BUILDALL => sub {
26 Moose::Util::MetaRole::apply_metaroles(
29 class => ['Foo::Trait::Class'],
35 is($called, 0, "no calls before inlining");
36 Foo->meta->make_immutable;
39 is($called, 1, "inlined constructor has trait modifications");
41 ok(Foo->meta->meta->does_role('Foo::Trait::Class'),
42 "class has correct traits");
53 is($called, 0, "no calls before inlining");
55 Foo::Sub->meta->make_immutable;
58 is($called, 1, "inherits trait properly");
60 ok(Foo::Sub->meta->meta->can('does_role')
61 && Foo::Sub->meta->meta->does_role('Foo::Trait::Class'),
62 "subclass inherits traits");
70 use Moose -traits => ['Foo2::Role'];
79 my $meta = __PACKAGE__->meta;
80 ::is( ::exception { $meta->superclasses('Foo2') }, undef, "can set superclasses once" );
81 ::isa_ok($meta, Foo2->meta->meta->name);
82 ::is( ::exception { $meta->superclasses('Bar2') }, undef, "can still set superclasses" );
83 ::isa_ok($meta, Bar2->meta->meta->name);
84 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
86 "still have the role attached");
87 ::ok(!$meta->is_immutable,
88 "immutable superclass doesn't make this class immutable");
89 ::is( ::exception { $meta->make_immutable }, undef, "can still make immutable" );
97 use Moose -traits => ['Foo3::Role'];
101 use Moose -traits => ['Foo3::Role'];
102 my $meta = __PACKAGE__->meta;
103 ::is( ::exception { $meta->superclasses('Foo2') }, undef, "can set superclasses once" );
104 ::isa_ok($meta, Foo2->meta->meta->name);
105 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
106 ['Foo2::Role', 'Foo3::Role'],
107 "reconciled roles correctly");
108 ::is( ::exception { $meta->superclasses('Bar3') }, undef, "can still set superclasses" );
109 ::isa_ok($meta, Bar3->meta->meta->name);
110 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
111 ['Foo2::Role', 'Foo3::Role'],
112 "roles still the same");
113 ::ok(!$meta->is_immutable,
114 "immutable superclass doesn't make this class immutable");
115 ::is( ::exception { $meta->make_immutable }, undef, "can still make immutable" );
123 use Moose -traits => ['Foo3::Role'];
124 my $meta = __PACKAGE__->meta;
125 ::is( ::exception { $meta->superclasses('Foo2') }, undef, "can set superclasses once" );
126 ::isa_ok($meta, Foo2->meta->meta->name);
127 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
128 ['Foo2::Role', 'Foo3::Role'],
129 "reconciled roles correctly");
130 ::is( ::exception { $meta->superclasses('Quux3') }, undef, "can still set superclasses" );
131 ::isa_ok($meta, Quux3->meta->meta->name);
132 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
133 ['Foo2::Role', 'Foo3::Role'],
134 "roles still the same");
135 ::ok(!$meta->is_immutable,
136 "immutable superclass doesn't make this class immutable");
137 ::is( ::exception { $meta->make_immutable }, undef, "can still make immutable" );
146 use Moose -traits => ['Foo4::Role'];
147 __PACKAGE__->meta->make_immutable;
156 my $meta = __PACKAGE__->meta;
157 ::is( ::exception { $meta->superclasses('Foo4') }, undef, "can set superclasses once" );
158 ::isa_ok($meta, Foo4->meta->_get_mutable_metaclass_name);
159 ::is( ::exception { $meta->superclasses('Bar4') }, undef, "can still set superclasses" );
160 ::isa_ok($meta, Bar4->meta->meta->name);
161 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
163 "still have the role attached");
164 ::ok(!$meta->is_immutable,
165 "immutable superclass doesn't make this class immutable");
166 ::is( ::exception { $meta->make_immutable }, undef, "can still make immutable" );
174 use Moose -traits => ['Foo5::Role'];
178 use Moose -traits => ['Foo5::Role'];
179 my $meta = __PACKAGE__->meta;
180 ::is( ::exception { $meta->superclasses('Foo4') }, undef, "can set superclasses once" );
181 ::isa_ok($meta, Foo4->meta->_get_mutable_metaclass_name);
182 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
183 ['Foo4::Role', 'Foo5::Role'],
184 "reconciled roles correctly");
185 ::is( ::exception { $meta->superclasses('Bar5') }, undef, "can still set superclasses" );
186 ::isa_ok($meta, Bar5->meta->meta->name);
187 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
188 ['Foo4::Role', 'Foo5::Role'],
189 "roles still the same");
190 ::ok(!$meta->is_immutable,
191 "immutable superclass doesn't make this class immutable");
192 ::is( ::exception { $meta->make_immutable }, undef, "can still make immutable" );
200 use Moose -traits => ['Foo5::Role'];
201 my $meta = __PACKAGE__->meta;
202 ::is( ::exception { $meta->superclasses('Foo4') }, undef, "can set superclasses once" );
203 ::isa_ok($meta, Foo4->meta->_get_mutable_metaclass_name);
204 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
205 ['Foo4::Role', 'Foo5::Role'],
206 "reconciled roles correctly");
207 ::is( ::exception { $meta->superclasses('Quux5') }, undef, "can still set superclasses" );
208 ::isa_ok($meta, Quux5->meta->meta->name);
209 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
210 ['Foo4::Role', 'Foo5::Role'],
211 "roles still the same");
212 ::ok(!$meta->is_immutable,
213 "immutable superclass doesn't make this class immutable");
214 ::is( ::exception { $meta->make_immutable }, undef, "can still make immutable" );
218 package Foo5::Meta::Role;
222 package Foo5::SuperClass::WithMetaRole;
223 use Moose -traits =>'Foo5::Meta::Role';
226 package Foo5::SuperClass::After::Attribute;
232 my @superclasses = ('Foo5::SuperClass::WithMetaRole');
233 extends @superclasses;
235 has an_attribute_generating_methods => ( is => 'ro' );
237 push(@superclasses, 'Foo5::SuperClass::After::Attribute');
240 extends @superclasses;
241 }, undef, 'MI extends after_generated_methods with metaclass roles' );
243 extends reverse @superclasses;
244 }, undef, 'MI extends after_generated_methods with metaclass roles (reverse)' );
248 package Foo6::Meta::Role;
252 package Foo6::SuperClass::WithMetaRole;
253 use Moose -traits =>'Foo6::Meta::Role';
256 package Foo6::Meta::OtherRole;
260 package Foo6::SuperClass::After::Attribute;
261 use Moose -traits =>'Foo6::Meta::OtherRole';
266 my @superclasses = ('Foo6::SuperClass::WithMetaRole');
267 extends @superclasses;
269 has an_attribute_generating_methods => ( is => 'ro' );
271 push(@superclasses, 'Foo6::SuperClass::After::Attribute');
273 ::like( ::exception {
274 extends @superclasses;
275 }, qr/compat.*pristine/, 'unsafe MI extends after_generated_methods with metaclass roles' );
276 ::like( ::exception {
277 extends reverse @superclasses;
278 }, qr/compat.*pristine/, 'unsafe MI extends after_generated_methods with metaclass roles (reverse)' );
282 package Foo7::Meta::Trait;
288 use Moose -traits => ['Foo7::Meta::Trait'];
293 # in an external file
294 use Moose -traits => ['Bar7::Meta::Trait'];
295 ::is( ::exception { extends 'Foo7' }, undef, "role reconciliation works" );
300 # in an external file
301 use Moose -traits => ['Bar7::Meta::Trait2'];
302 ::is( ::exception { extends 'Foo7' }, undef, "role reconciliation works" );