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