The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;

my $OPTS;
do {
    package My::Singleton::Role;
    use Moose::Role;

    sub foo { 'My::Singleton::Role' }

    package My::Role::Metaclass;
    use Moose;
    BEGIN { extends 'Moose::Meta::Role' };

    sub _role_for_combination {
        my ($self, $opts) = @_;
        $OPTS = $opts;
        return My::Singleton::Role->meta;
    }

    package My::Special::Role;
    use Moose::Role -metaclass => 'My::Role::Metaclass';

    sub foo { 'My::Special::Role' }

    package My::Usual::Role;
    use Moose::Role;

    sub bar { 'My::Usual::Role' }

    package My::Class;
    use Moose;

    with (
        'My::Special::Role' => { number => 1 },
        'My::Usual::Role' => { number => 2 },
    );
};

is(My::Class->foo, 'My::Singleton::Role', 'role_for_combination applied');
is(My::Class->bar, 'My::Usual::Role', 'collateral role');
is_deeply($OPTS, { number => 1 });

done_testing;