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

my $foo = 0;
my $bar = 0;
{
    package FooRole;
    use Mouse::Role;
    sub foo { 'ok1' }

    before method => sub { $foo++ };
}

{
    package BarRole;
    use Mouse::Role;
    sub bar { 'ok2' }

    before method => sub { $bar++ };
}

{
    package Baz;
    use Mouse;
    sub method {}
    no Mouse;
}

{
    package Qux;
    use Mouse;
    sub method {}
    no Mouse;
}

Mouse::Util::apply_all_roles('Baz', 'BarRole', 'FooRole');

my $baz = Baz->new;
is $baz->foo, 'ok1';
is $baz->bar, 'ok2';
is join(",", sort $baz->meta->get_method_list), 'bar,foo,meta,method';

# applyu to instance

my $qux = Qux->new;
Mouse::Util::apply_all_roles($qux, 'FooRole');
note $qux;
$foo = 0;
$bar = 0;
$qux->method;
is $foo, 1;
is $bar, 0;

$qux = Qux->new;
Mouse::Util::apply_all_roles($qux, 'BarRole');
note $qux;
$foo = 0;
$bar = 0;
$qux->method;
is $foo, 0;
is $bar, 1;

$qux = Qux->new;
Mouse::Util::apply_all_roles($qux, 'FooRole', 'BarRole');
note $qux;
$foo = 0;
$bar = 0;
$qux->method;
is $foo, 1;
is $bar, 1;

done_testing;