use strict;
use warnings;
use Test::More 0.88;
use Test::Fatal;
use Test::Warnings;
use lib 't/lib';
{
package Role::HasFallback;
use Moose::Role;
use overload
q{""} => '_stringify',
fallback => 1;
sub _stringify { __PACKAGE__ }
}
{
package Role::NoFallback;
use Moose::Role;
use overload
'0+' => '_numify',
fallback => 0;
sub _numify { 42 }
}
{
package Class1;
use Moose;
::like(
::exception { with qw( Role::HasFallback Role::NoFallback ) },
qr/\QWe have encountered an overloading conflict for the fallback during composition. This is a fatal error./,
'exception from fallback conflict during role summation'
);
}
{
package Role::NoOverloading;
use Moose::Role;
sub foo { 42 }
}
{
package Class2;
use Moose;
::like(
::exception { with qw( Role::HasFallback Role::NoFallback Role::NoOverloading ) },
qr/\QWe have encountered an overloading conflict for the fallback during composition. This is a fatal error./,
'exception from fallback conflict during role summation including role without overloading'
);
}
{
package Role::StringifiesViaSubref1;
use Moose::Role;
use overload q{""} => sub { 'foo' };
}
{
package Role::StringifiesViaSubref2;
use Moose::Role;
use overload q{""} => sub { 'bar' };
}
{
package Class3;
use Moose;
::like(
::exception { with qw( Role::StringifiesViaSubref1 Role::StringifiesViaSubref2 ) },
qr/\QThe two roles both overload the '""' operator. This is a fatal error./,
'exception when two roles with different subref overloading conflict during role summation'
);
}
{
package Class4;
use Moose;
::like(
::exception { with qw( Role::StringifiesViaSubref1 Role::StringifiesViaSubref2 Role::NoOverloading ) },
qr/\QThe two roles both overload the '""' operator. This is a fatal error./,
'exception when two roles with different subref overloading conflict during role summation including role without overloading'
);
}
{
package Role::StringifiesViaMethod1;
use Moose::Role;
use overload q{""} => '_stringify1';
sub _stringify1 { 'foo' }
}
{
package Role::StringifiesViaMethod2;
use Moose::Role;
use overload q{""} => '_stringify2';
sub _stringify2 { 'foo' }
}
{
package Class5;
use Moose;
::like(
::exception { with qw( Role::StringifiesViaMethod1 Role::StringifiesViaMethod2 ) },
qr/\QThe two roles both overload the '""' operator. This is a fatal error./,
'exception when two roles with different method overloading conflict during role summation'
);
}
{
package Class6;
use Moose;
::like(
::exception { with qw( Role::StringifiesViaMethod1 Role::StringifiesViaMethod2 Role::NoOverloading ) },
qr/\QThe two roles both overload the '""' operator. This is a fatal error./,
'exception when two roles with different method overloading conflict during role summation including role without overloading'
);
}
{
{
package R1;
use Moose::Role;
use overload '&{}' => 'as_code';
sub as_code { }
}
{
package R2;
use Moose::Role;
with 'R1';
}
{
package C1;
use Moose;
::is(
::exception { with 'R1', 'R2' },
undef,
'no conflict when class consumes multiple roles with the same overloading'
);
}
}
done_testing();