Redid conversion to Test::Fatal
[gitmo/Moose.git] / t / 050_metaclasses / 060_reinitialize.t
CommitLineData
c1f0275a 1#!/usr/bin/env perl
2use strict;
3use warnings;
4use Test::More;
5use Test::Moose;
b10dde3a 6use Test::Fatal;
c1f0275a 7
8sub check_meta_sanity {
9 my ($meta, $class) = @_;
10 local $Test::Builder::Level = $Test::Builder::Level + 1;
11 isa_ok($meta, 'Moose::Meta::Class');
12 is($meta->name, $class);
13 ok($meta->has_method('foo'));
14 isa_ok($meta->get_method('foo'), 'Moose::Meta::Method');
15 ok($meta->has_attribute('bar'));
16 isa_ok($meta->get_attribute('bar'), 'Moose::Meta::Attribute');
17}
18
19{
20 package Foo;
21 use Moose;
22 sub foo {}
23 has bar => (is => 'ro');
24}
25
26check_meta_sanity(Foo->meta, 'Foo');
27
28Moose::Meta::Class->reinitialize('Foo');
29check_meta_sanity(Foo->meta, 'Foo');
30
31{
32 package Foo::Role::Method;
33 use Moose::Role;
34
35 has foo => (is => 'rw');
36}
37
38{
39 package Foo::Role::Attribute;
40 use Moose::Role;
41 has oof => (is => 'rw');
42}
43
44Moose::Util::MetaRole::apply_metaroles(
45 for => 'Foo',
46 class_metaroles => {
47 method => ['Foo::Role::Method'],
48 attribute => ['Foo::Role::Attribute'],
49 },
50);
51check_meta_sanity(Foo->meta, 'Foo');
52does_ok(Foo->meta->get_method('foo'), 'Foo::Role::Method');
53does_ok(Foo->meta->get_attribute('bar'), 'Foo::Role::Attribute');
54
55Moose::Meta::Class->reinitialize('Foo');
56check_meta_sanity(Foo->meta, 'Foo');
57does_ok(Foo->meta->get_method('foo'), 'Foo::Role::Method');
58does_ok(Foo->meta->get_attribute('bar'), 'Foo::Role::Attribute');
59
60Foo->meta->get_method('foo')->foo('TEST');
61Foo->meta->get_attribute('bar')->oof('TSET');
62is(Foo->meta->get_method('foo')->foo, 'TEST');
63is(Foo->meta->get_attribute('bar')->oof, 'TSET');
64Moose::Meta::Class->reinitialize('Foo');
65check_meta_sanity(Foo->meta, 'Foo');
66is(Foo->meta->get_method('foo')->foo, 'TEST');
67is(Foo->meta->get_attribute('bar')->oof, 'TSET');
68
69{
70 package Bar::Role::Method;
71 use Moose::Role;
72}
73
74{
75 package Bar::Role::Attribute;
76 use Moose::Role;
77}
78
79{
80 package Bar;
81 use Moose;
82 Moose::Util::MetaRole::apply_metaroles(
83 for => 'Bar',
84 class_metaroles => {
85 method => ['Bar::Role::Method'],
86 attribute => ['Bar::Role::Attribute'],
87 },
88 );
89 sub foo {}
90 has bar => (is => 'ro');
91}
92
93check_meta_sanity(Bar->meta, 'Bar');
94does_ok(Bar->meta->get_method('foo'), 'Bar::Role::Method');
95does_ok(Bar->meta->get_attribute('bar'), 'Bar::Role::Attribute');
96
97Moose::Meta::Class->reinitialize('Bar');
98check_meta_sanity(Bar->meta, 'Bar');
99does_ok(Bar->meta->get_method('foo'), 'Bar::Role::Method');
100does_ok(Bar->meta->get_attribute('bar'), 'Bar::Role::Attribute');
101ok(!Moose::Util::does_role(Bar->meta->get_method('foo'), 'Foo::Role::Method'));
102ok(!Moose::Util::does_role(Bar->meta->get_attribute('bar'), 'Foo::Role::Attribute'));
103
104Moose::Util::MetaRole::apply_metaroles(
105 for => 'Bar',
106 class_metaroles => {
107 method => ['Foo::Role::Method'],
108 attribute => ['Foo::Role::Attribute'],
109 },
110);
111check_meta_sanity(Bar->meta, 'Bar');
112does_ok(Bar->meta->get_method('foo'), 'Bar::Role::Method');
113does_ok(Bar->meta->get_attribute('bar'), 'Bar::Role::Attribute');
114does_ok(Bar->meta->get_method('foo'), 'Foo::Role::Method');
115does_ok(Bar->meta->get_attribute('bar'), 'Foo::Role::Attribute');
116
117{
118 package Bar::Meta::Method;
119 use Moose;
120 BEGIN { extends 'Moose::Meta::Method' };
121}
122
123{
124 package Bar::Meta::Attribute;
125 use Moose;
126 BEGIN { extends 'Moose::Meta::Attribute' };
127}
128
b10dde3a 129like( exception {
a59a263f 130 Moose::Meta::Class->reinitialize(
131 'Bar',
132 method_metaclass => 'Bar::Meta::Method',
133 attribute_metaclass => 'Bar::Meta::Attribute',
134 );
b10dde3a 135}, qr/compatible/ );
c1f0275a 136
137{
138 package Baz::Meta::Class;
139 use Moose;
140 BEGIN { extends 'Moose::Meta::Class' };
141
142 sub initialize {
143 my $self = shift;
144 return $self->SUPER::initialize(
145 @_,
146 method_metaclass => 'Bar::Meta::Method',
147 attribute_metaclass => 'Bar::Meta::Attribute'
148 );
149 }
150}
151
152{
153 package Baz;
154 use Moose -metaclass => 'Baz::Meta::Class';
155 sub foo {}
156 has bar => (is => 'ro');
157}
158
159check_meta_sanity(Baz->meta, 'Baz');
160isa_ok(Baz->meta->get_method('foo'), 'Bar::Meta::Method');
161isa_ok(Baz->meta->get_attribute('bar'), 'Bar::Meta::Attribute');
162Moose::Meta::Class->reinitialize('Baz');
163check_meta_sanity(Baz->meta, 'Baz');
164isa_ok(Baz->meta->get_method('foo'), 'Bar::Meta::Method');
165isa_ok(Baz->meta->get_attribute('bar'), 'Bar::Meta::Attribute');
166
167Moose::Util::MetaRole::apply_metaroles(
168 for => 'Baz',
169 class_metaroles => {
170 method => ['Foo::Role::Method'],
171 attribute => ['Foo::Role::Attribute'],
172 },
173);
174check_meta_sanity(Baz->meta, 'Baz');
175isa_ok(Baz->meta->get_method('foo'), 'Bar::Meta::Method');
176isa_ok(Baz->meta->get_attribute('bar'), 'Bar::Meta::Attribute');
177does_ok(Baz->meta->get_method('foo'), 'Foo::Role::Method');
178does_ok(Baz->meta->get_attribute('bar'), 'Foo::Role::Attribute');
179
a59a263f 180{
181 package Baz::Meta::Method;
182 use Moose;
183 extends 'Moose::Meta::Method';
184}
185
186{
187 package Baz::Meta::Attribute;
188 use Moose;
189 extends 'Moose::Meta::Attribute';
190}
191
b10dde3a 192like( exception {
c1f0275a 193 Moose::Meta::Class->reinitialize(
194 'Baz',
a59a263f 195 method_metaclass => 'Baz::Meta::Method',
196 attribute_metaclass => 'Baz::Meta::Attribute',
c1f0275a 197 );
b10dde3a 198}, qr/compatible/ );
c1f0275a 199
7767a8d9 200{
201 package Quux;
202 use Moose;
203 sub foo { }
204 before foo => sub { };
205 has bar => (is => 'ro');
206 sub DEMOLISH { }
207 __PACKAGE__->meta->make_immutable;
208}
209
210ok(Quux->meta->has_method('new'));
211isa_ok(Quux->meta->get_method('new'), 'Moose::Meta::Method::Constructor');
212ok(Quux->meta->has_method('meta'));
213isa_ok(Quux->meta->get_method('meta'), 'Moose::Meta::Method::Meta');
214ok(Quux->meta->has_method('foo'));
215isa_ok(Quux->meta->get_method('foo'), 'Class::MOP::Method::Wrapped');
216ok(Quux->meta->has_method('bar'));
217isa_ok(Quux->meta->get_method('bar'), 'Moose::Meta::Method::Accessor');
218ok(Quux->meta->has_method('DESTROY'));
219isa_ok(Quux->meta->get_method('DESTROY'), 'Moose::Meta::Method::Destructor');
220ok(Quux->meta->has_method('DEMOLISH'));
221isa_ok(Quux->meta->get_method('DEMOLISH'), 'Moose::Meta::Method');
222
223Quux->meta->make_mutable;
224Moose::Meta::Class->reinitialize('Quux');
225Quux->meta->make_immutable;
226
227ok(Quux->meta->has_method('new'));
228isa_ok(Quux->meta->get_method('new'), 'Moose::Meta::Method::Constructor');
229ok(Quux->meta->has_method('meta'));
230isa_ok(Quux->meta->get_method('meta'), 'Moose::Meta::Method::Meta');
231ok(Quux->meta->has_method('foo'));
232isa_ok(Quux->meta->get_method('foo'), 'Class::MOP::Method::Wrapped');
233ok(Quux->meta->has_method('bar'));
234isa_ok(Quux->meta->get_method('bar'), 'Moose::Meta::Method::Accessor');
235ok(Quux->meta->has_method('DESTROY'));
236isa_ok(Quux->meta->get_method('DESTROY'), 'Moose::Meta::Method::Destructor');
237ok(Quux->meta->has_method('DEMOLISH'));
238isa_ok(Quux->meta->get_method('DEMOLISH'), 'Moose::Meta::Method');
239
240Quux->meta->make_mutable;
241Moose::Util::MetaRole::apply_metaroles(
242 for => 'Quux',
243 class_metaroles => {
244 method => ['Foo::Role::Method'],
245 attribute => ['Foo::Role::Attribute'],
246 },
247);
248Quux->meta->make_immutable;
249
250ok(Quux->meta->has_method('new'));
251isa_ok(Quux->meta->get_method('new'), 'Moose::Meta::Method::Constructor');
252{ local $TODO = "constructor methods don't get metaroles yet";
253does_ok(Quux->meta->get_method('new'), 'Foo::Role::Method');
254}
255ok(Quux->meta->has_method('meta'));
256isa_ok(Quux->meta->get_method('meta'), 'Moose::Meta::Method::Meta');
257{ local $TODO = "meta methods don't get metaroles yet";
258does_ok(Quux->meta->get_method('meta'), 'Foo::Role::Method');
259}
260ok(Quux->meta->has_method('foo'));
261isa_ok(Quux->meta->get_method('foo'), 'Class::MOP::Method::Wrapped');
262{ local $TODO = "modified methods don't get metaroles yet";
263does_ok(Quux->meta->get_method('foo'), 'Foo::Role::Method');
264}
265ok(Quux->meta->has_method('bar'));
266isa_ok(Quux->meta->get_method('bar'), 'Moose::Meta::Method::Accessor');
267{ local $TODO = "accessor methods don't get metaroles yet";
268does_ok(Quux->meta->get_method('bar'), 'Foo::Role::Method');
269}
270ok(Quux->meta->has_method('DESTROY'));
271isa_ok(Quux->meta->get_method('DESTROY'), 'Moose::Meta::Method::Destructor');
272{ local $TODO = "destructor methods don't get metaroles yet";
273does_ok(Quux->meta->get_method('DESTROY'), 'Foo::Role::Method');
274}
275ok(Quux->meta->has_method('DEMOLISH'));
276isa_ok(Quux->meta->get_method('DEMOLISH'), 'Moose::Meta::Method');
277does_ok(Quux->meta->get_method('DEMOLISH'), 'Foo::Role::Method');
278
c1f0275a 279done_testing;