10 package Foo::Trait::Constructor;
13 around _generate_BUILDALL => sub {
16 return $self->$orig(@_) . '$::called++;';
23 Moose::Util::MetaRole::apply_metaroles(
26 constructor => ['Foo::Trait::Constructor'],
32 is($called, 0, "no calls before inlining");
33 Foo->meta->make_immutable;
36 is($called, 1, "inlined constructor has trait modifications");
38 ok(Foo->meta->constructor_class->meta->does_role('Foo::Trait::Constructor'),
39 "class has correct constructor traits");
50 is($called, 0, "no calls before inlining");
52 Foo::Sub->meta->make_immutable;
55 is($called, 1, "inherits constructor trait properly");
57 ok(Foo::Sub->meta->constructor_class->meta->can('does_role')
58 && Foo::Sub->meta->constructor_class->meta->does_role('Foo::Trait::Constructor'),
59 "subclass inherits constructor traits");
67 use Moose -traits => ['Foo2::Role'];
76 my $meta = __PACKAGE__->meta;
77 ::lives_ok { $meta->superclasses('Foo2') } "can set superclasses once";
78 ::isa_ok($meta, Foo2->meta->meta->name);
79 ::lives_ok { $meta->superclasses('Bar2') } "can still set superclasses";
80 ::isa_ok($meta, Bar2->meta->meta->name);
81 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
83 "still have the role attached");
84 ::ok(!$meta->is_immutable,
85 "immutable superclass doesn't make this class immutable");
86 ::lives_ok { $meta->make_immutable } "can still make immutable";
94 use Moose -traits => ['Foo3::Role'];
98 use Moose -traits => ['Foo3::Role'];
99 my $meta = __PACKAGE__->meta;
100 ::lives_ok { $meta->superclasses('Foo2') } "can set superclasses once";
101 ::isa_ok($meta, Foo2->meta->meta->name);
102 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
103 ['Foo2::Role', 'Foo3::Role'],
104 "reconciled roles correctly");
105 ::lives_ok { $meta->superclasses('Bar3') } "can still set superclasses";
106 ::isa_ok($meta, Bar3->meta->meta->name);
107 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
108 ['Foo2::Role', 'Foo3::Role'],
109 "roles still the same");
110 ::ok(!$meta->is_immutable,
111 "immutable superclass doesn't make this class immutable");
112 ::lives_ok { $meta->make_immutable } "can still make immutable";
120 use Moose -traits => ['Foo3::Role'];
121 my $meta = __PACKAGE__->meta;
122 ::lives_ok { $meta->superclasses('Foo2') } "can set superclasses once";
123 ::isa_ok($meta, Foo2->meta->meta->name);
124 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
125 ['Foo2::Role', 'Foo3::Role'],
126 "reconciled roles correctly");
127 ::lives_ok { $meta->superclasses('Quux3') } "can still set superclasses";
128 ::isa_ok($meta, Quux3->meta->meta->name);
129 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
130 ['Foo2::Role', 'Foo3::Role'],
131 "roles still the same");
132 ::ok(!$meta->is_immutable,
133 "immutable superclass doesn't make this class immutable");
134 ::lives_ok { $meta->make_immutable } "can still make immutable";
143 use Moose -traits => ['Foo4::Role'];
144 __PACKAGE__->meta->make_immutable;
153 my $meta = __PACKAGE__->meta;
154 ::lives_ok { $meta->superclasses('Foo4') } "can set superclasses once";
155 ::isa_ok($meta, Foo4->meta->_get_mutable_metaclass_name);
156 ::lives_ok { $meta->superclasses('Bar4') } "can still set superclasses";
157 ::isa_ok($meta, Bar4->meta->meta->name);
158 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
160 "still have the role attached");
161 ::ok(!$meta->is_immutable,
162 "immutable superclass doesn't make this class immutable");
163 ::lives_ok { $meta->make_immutable } "can still make immutable";
171 use Moose -traits => ['Foo5::Role'];
175 use Moose -traits => ['Foo5::Role'];
176 my $meta = __PACKAGE__->meta;
177 ::lives_ok { $meta->superclasses('Foo4') } "can set superclasses once";
178 ::isa_ok($meta, Foo4->meta->_get_mutable_metaclass_name);
179 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
180 ['Foo4::Role', 'Foo5::Role'],
181 "reconciled roles correctly");
182 ::lives_ok { $meta->superclasses('Bar5') } "can still set superclasses";
183 ::isa_ok($meta, Bar5->meta->meta->name);
184 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
185 ['Foo4::Role', 'Foo5::Role'],
186 "roles still the same");
187 ::ok(!$meta->is_immutable,
188 "immutable superclass doesn't make this class immutable");
189 ::lives_ok { $meta->make_immutable } "can still make immutable";
197 use Moose -traits => ['Foo5::Role'];
198 my $meta = __PACKAGE__->meta;
199 ::lives_ok { $meta->superclasses('Foo4') } "can set superclasses once";
200 ::isa_ok($meta, Foo4->meta->_get_mutable_metaclass_name);
201 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
202 ['Foo4::Role', 'Foo5::Role'],
203 "reconciled roles correctly");
204 ::lives_ok { $meta->superclasses('Quux5') } "can still set superclasses";
205 ::isa_ok($meta, Quux5->meta->meta->name);
206 ::is_deeply([sort map { $_->name } $meta->meta->calculate_all_roles_with_inheritance],
207 ['Foo4::Role', 'Foo5::Role'],
208 "roles still the same");
209 ::ok(!$meta->is_immutable,
210 "immutable superclass doesn't make this class immutable");
211 ::lives_ok { $meta->make_immutable } "can still make immutable";
215 package Foo5::Meta::Role;
219 package Foo5::SuperClass::WithMetaRole;
220 use Moose -traits =>'Foo5::Meta::Role';
223 package Foo5::SuperClass::After::Attribute;
229 my @superclasses = ('Foo5::SuperClass::WithMetaRole');
230 extends @superclasses;
232 has an_attribute_generating_methods => ( is => 'ro' );
234 push(@superclasses, 'Foo5::SuperClass::After::Attribute');
237 extends @superclasses;
238 } 'MI extends after_generated_methods with metaclass roles';
240 extends reverse @superclasses;
242 'MI extends after_generated_methods with metaclass roles (reverse)';
246 package Foo6::Meta::Role;
250 package Foo6::SuperClass::WithMetaRole;
251 use Moose -traits =>'Foo6::Meta::Role';
254 package Foo6::Meta::OtherRole;
258 package Foo6::SuperClass::After::Attribute;
259 use Moose -traits =>'Foo6::Meta::OtherRole';
264 my @superclasses = ('Foo6::SuperClass::WithMetaRole');
265 extends @superclasses;
267 has an_attribute_generating_methods => ( is => 'ro' );
269 push(@superclasses, 'Foo6::SuperClass::After::Attribute');
272 extends @superclasses;
273 } qr/compat.*pristine/,
274 'unsafe MI extends after_generated_methods with metaclass roles';
276 extends reverse @superclasses;
277 } qr/compat.*pristine/,
278 '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 ::lives_ok { extends 'Foo7' } "role reconciliation works";
300 # in an external file
301 use Moose -traits => ['Bar7::Meta::Trait2'];
302 ::lives_ok { extends 'Foo7' } "role reconciliation works";