Commit | Line | Data |
f2391d17 |
1 | use strict; |
2 | use warnings; |
1276b4c9 |
3 | use Test::More tests => 18; |
ef55236d |
4 | use Class::MOP (); |
f2391d17 |
5 | |
6 | { |
7 | package My::Role; |
8 | use Moose::Role; |
9 | } |
5009e3d0 |
10 | |
f2391d17 |
11 | { |
12 | package SomeClass; |
13 | use Moose -traits => 'My::Role'; |
14 | } |
5009e3d0 |
15 | |
f2391d17 |
16 | { |
17 | package SubClassUseBase; |
18 | use base qw/SomeClass/; |
19 | } |
5009e3d0 |
20 | |
f2391d17 |
21 | { |
22 | package SubSubClassUseBase; |
23 | use Moose; |
ce9489ef |
24 | use Test::More; |
f2391d17 |
25 | use Test::Exception; |
349cda54 |
26 | lives_ok { |
27 | extends 'SubClassUseBase'; |
5009e3d0 |
28 | } |
1276b4c9 |
29 | 'Can extend non-Moose class with parent class that is a Moose class with a meta role'; |
f2391d17 |
30 | } |
1276b4c9 |
31 | |
32 | { |
33 | ok( SubSubClassUseBase->meta->meta->can('does_role') |
34 | && SubSubClassUseBase->meta->meta->does_role('My::Role'), |
35 | 'SubSubClassUseBase meta metaclass does the My::Role role' ); |
36 | } |
37 | |
ef55236d |
38 | # Note, remote metaclasses of the 'use base' classes after each test, so that |
39 | # they have to be re-initialized - otherwise latter tests would not demonstrate |
40 | # the original issue. |
41 | Class::MOP::remove_metaclass_by_name('SubClassUseBase'); |
42 | |
1276b4c9 |
43 | { |
44 | package OtherClass; |
45 | use Moose; |
46 | } |
47 | |
48 | { |
49 | package OtherSubClassUseBase; |
50 | use base 'OtherClass'; |
51 | } |
52 | |
53 | { |
54 | package MultiParent1; |
55 | use Moose; |
56 | use Test::More; |
57 | use Test::Exception; |
58 | lives_ok { |
59 | extends qw( SubClassUseBase OtherSubClassUseBase ); |
60 | } |
61 | 'Can extend two non-Moose classes with parents that are different Moose metaclasses'; |
62 | } |
63 | |
64 | { |
65 | ok( MultiParent1->meta->meta->can('does_role') |
66 | && MultiParent1->meta->meta->does_role('My::Role'), |
67 | 'MultiParent1 meta metaclass does the My::Role role' ); |
68 | } |
69 | |
ef55236d |
70 | Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/); |
71 | |
1276b4c9 |
72 | { |
73 | package MultiParent2; |
74 | use Moose; |
75 | use Test::More; |
76 | use Test::Exception; |
77 | lives_ok { |
78 | extends qw( OtherSubClassUseBase SubClassUseBase ); |
79 | } |
80 | 'Can extend two non-Moose classes with parents that are different Moose metaclasses (reverse order)'; |
81 | } |
82 | |
83 | { |
84 | ok( MultiParent2->meta->meta->can('does_role') |
85 | && MultiParent2->meta->meta->does_role('My::Role'), |
86 | 'MultiParent2 meta metaclass does the My::Role role' ); |
87 | } |
88 | |
ef55236d |
89 | Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/); |
90 | |
1276b4c9 |
91 | { |
92 | package MultiParent3; |
93 | use Moose; |
94 | use Test::More; |
95 | use Test::Exception; |
96 | lives_ok { |
97 | extends qw( OtherClass SubClassUseBase ); |
98 | } |
99 | 'Can extend one Moose class and one non-Moose class'; |
100 | } |
101 | |
102 | { |
103 | ok( MultiParent3->meta->meta->can('does_role') |
104 | && MultiParent3->meta->meta->does_role('My::Role'), |
105 | 'MultiParent3 meta metaclass does the My::Role role' ); |
106 | } |
107 | |
ef55236d |
108 | Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/); |
109 | |
1276b4c9 |
110 | { |
111 | package MultiParent4; |
112 | use Moose; |
113 | use Test::More; |
114 | use Test::Exception; |
115 | lives_ok { |
116 | extends qw( SubClassUseBase OtherClass ); |
117 | } |
118 | 'Can extend one non-Moose class and one Moose class'; |
119 | } |
120 | |
121 | { |
122 | ok( MultiParent4->meta->meta->can('does_role') |
123 | && MultiParent4->meta->meta->does_role('My::Role'), |
124 | 'MultiParent4 meta metaclass does the My::Role role' ); |
125 | } |
126 | |
ef55236d |
127 | Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/); |
128 | |
1276b4c9 |
129 | { |
130 | package MultiChild1; |
131 | use Moose; |
132 | use Test::More; |
133 | use Test::Exception; |
134 | lives_ok { |
135 | extends 'MultiParent1'; |
136 | } |
137 | 'Can extend class that itself extends two non-Moose classes with Moose parents'; |
138 | } |
139 | |
140 | { |
141 | ok( MultiChild1->meta->meta->can('does_role') |
142 | && MultiChild1->meta->meta->does_role('My::Role'), |
143 | 'MultiChild1 meta metaclass does the My::Role role' ); |
144 | } |
145 | |
ef55236d |
146 | Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/); |
147 | |
1276b4c9 |
148 | { |
149 | package MultiChild2; |
150 | use Moose; |
151 | use Test::More; |
152 | use Test::Exception; |
153 | lives_ok { |
154 | extends 'MultiParent2'; |
155 | } |
156 | 'Can extend class that itself extends two non-Moose classes with Moose parents (reverse order)'; |
157 | } |
158 | |
159 | { |
160 | ok( MultiChild2->meta->meta->can('does_role') |
161 | && MultiChild2->meta->meta->does_role('My::Role'), |
162 | 'MultiChild2 meta metaclass does the My::Role role' ); |
163 | } |
164 | |
ef55236d |
165 | Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/); |
166 | |
1276b4c9 |
167 | { |
168 | package MultiChild3; |
169 | use Moose; |
170 | use Test::More; |
171 | use Test::Exception; |
172 | lives_ok { |
173 | extends 'MultiParent3'; |
174 | } |
175 | 'Can extend class that itself extends one Moose and one non-Moose parent'; |
176 | } |
177 | |
178 | { |
179 | ok( MultiChild3->meta->meta->can('does_role') |
180 | && MultiChild3->meta->meta->does_role('My::Role'), |
181 | 'MultiChild3 meta metaclass does the My::Role role' ); |
182 | } |
183 | |
ef55236d |
184 | Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/); |
185 | |
1276b4c9 |
186 | { |
187 | package MultiChild4; |
188 | use Moose; |
189 | use Test::More; |
190 | use Test::Exception; |
191 | lives_ok { |
192 | extends 'MultiParent4'; |
193 | } |
194 | 'Can extend class that itself extends one non-Moose and one Moose parent'; |
195 | } |
196 | |
197 | { |
198 | ok( MultiChild4->meta->meta->can('does_role') |
199 | && MultiChild4->meta->meta->does_role('My::Role'), |
200 | 'MultiChild4 meta metaclass does the My::Role role' ); |
201 | } |
202 | |
ef55236d |
203 | Class::MOP::remove_metaclass_by_name(qw/SubClassUseBase OtherSubClassUseBase/); |
204 | |