use strict; use warnings; use Test::More; use Test::Fatal; use Moose(); { { package Foo1; use Moose::Role; excludes 'Bar1'; } { package Bar1; use Moose::Role; } my $exception = exception { package CompositeRole; use Moose::Role; with 'Foo1', 'Bar1'; }; like( $exception, qr/\QConflict detected: Role Foo1 excludes role 'Bar1'/, "role Foo1 excludes role Bar1"); isa_ok( $exception, "Moose::Exception::RoleExclusionConflict", "role Foo1 excludes role Bar1"); is( $exception->role_name, "Bar1", "role Foo1 excludes role Bar1"); is_deeply( $exception->roles, ["Foo1"], "role Foo1 excludes role Bar1"); { package Baz1; use Moose::Role; excludes 'Bar1'; } $exception = exception { package CompositeRole1; use Moose::Role; with 'Foo1', 'Bar1', 'Baz1'; }; like( $exception, qr/\QConflict detected: Roles Foo1, Baz1 exclude role 'Bar1'/, "role Foo1 & Baz1 exclude role Bar1"); isa_ok( $exception, "Moose::Exception::RoleExclusionConflict", "role Foo1 & Baz1 exclude role Bar1"); is( $exception->role_name, "Bar1", "role Foo1 & Baz1 exclude role Bar1"); is_deeply( $exception->roles, ["Foo1", 'Baz1'], "role Foo1 & Baz1 exclude role Bar1"); } { { package Foo2; use Moose::Role; has 'foo' => ( isa => 'Int' ); } { package Bar2; use Moose::Role; has 'foo' => ( isa => 'Int' ); } my $exception = exception { package CompositeRole2; use Moose::Role; with 'Foo2', 'Bar2'; }; like( $exception, qr/\QWe have encountered an attribute conflict with 'foo' during role composition. This attribute is defined in both Foo2 and Bar2. This is a fatal error and cannot be disambiguated./, "role Foo2 & Bar2, both have an attribute named foo"); isa_ok( $exception, "Moose::Exception::AttributeConflictInSummation", "role Foo2 & Bar2, both have an attribute named foo"); is( $exception->role_name, "Foo2", "role Foo2 & Bar2, both have an attribute named foo"); is( $exception->second_role_name, "Bar2", "role Foo2 & Bar2, both have an attribute named foo"); is( $exception->attribute_name, "foo", "role Foo2 & Bar2, both have an attribute named foo"); } { { package Foo3; use Moose::Role; sub foo {} } { package Bar3; use Moose::Role; override 'foo' => sub {} } my $exception = exception { package CompositeRole3; use Moose::Role; with 'Foo3', 'Bar3'; }; like( $exception, qr/\QRole 'Foo3|Bar3' has encountered an 'override' method conflict during composition (A local method of the same name has been found). This is a fatal error./, "role Foo3 has a local method 'foo' & role Bar3 is overriding that same method"); isa_ok( $exception, "Moose::Exception::OverrideConflictInSummation", "role Foo3 has a local method 'foo' & role Bar3 is overriding that same method"); my @role_names = $exception->role_names; my $role_names = join "|", @role_names; is( $role_names, "Foo3|Bar3", "role Foo3 has a local method 'foo' & role Bar3 is overriding that same method"); is( $exception->method_name, "foo", "role Foo3 has a local method 'foo' & role Bar3 is overriding that same method"); } { { package Foo4; use Moose::Role; override 'foo' => sub {}; } { package Bar4; use Moose::Role; override 'foo' => sub {}; } my $exception = exception { package CompositeRole4; use Moose::Role; with 'Foo4', 'Bar4'; }; like( $exception, qr/\QWe have encountered an 'override' method conflict during composition (Two 'override' methods of the same name encountered). This is a fatal error./, "role Foo4 & Bar4, both are overriding the same method 'foo'"); isa_ok( $exception, "Moose::Exception::OverrideConflictInSummation", "role Foo4 & Bar4, both are overriding the same method 'foo'"); my @role_names = $exception->role_names; my $role_names = join "|", @role_names; is( $role_names, "Foo4|Bar4", "role Foo4 & Bar4, both are overriding the same method 'foo'"); is( $exception->method_name, "foo", "role Foo4 & Bar4, both are overriding the same method 'foo'"); } done_testing;