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::Fatal; is( exception { extends 'SubClassUseBase'; }, undef, '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::Fatal; is( exception { extends qw( SubClassUseBase OtherSubClassUseBase ); }, undef, '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::Fatal; is( exception { extends qw( OtherSubClassUseBase SubClassUseBase ); }, undef, '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::Fatal; is( exception { extends qw( OtherClass SubClassUseBase ); }, undef, '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::Fatal; is( exception { extends qw( SubClassUseBase OtherClass ); }, undef, '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::Fatal; is( exception { extends 'MultiParent1'; }, undef, '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::Fatal; is( exception { extends 'MultiParent2'; }, undef, '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::Fatal; is( exception { extends 'MultiParent3'; }, undef, '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::Fatal; is( exception { extends 'MultiParent4'; }, undef, '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;