MooseのMRO

世間ではShikaとかMouseとかが叫ばれている中、久々にMooseを触ったボクです。
で、すごい勢いでMoose忘れてるのでこんなのさえわかんなくなってました。

{
    package Base;
    use Moose;
    sub foo { warn 'Base'; }
}

{
    package RoleA;
    use Moose::Role;
    before foo => sub { warn 'RoleA beofre'; };
{
    package Base;
    use Moose;
    sub foo { warn 'Base'; }
}

{
    package RoleA;
    use Moose::Role;
    before foo => sub { warn 'RoleA beofre'; };
    after foo => sub { warn 'RoleA after'; };
}

{
    package RoleB;
    use Moose::Role;
    before foo => sub { warn 'RoleB beofre'; };
    after foo => sub { warn 'RoleB after'; };
}

{
    package MyClass;
    use Moose;
    extends 'Base';
    with qw/RoleA RoleB/;

    before foo => sub { warn 'MyClass beofre'; };
    after foo => sub { warn 'MyClass after'; };
}

MyClass->new->foo;

だとどういう順番で呼ばれるのかなーと実行してみると

MyClass beofre at main.pl line 27.
RoleB beofre at main.pl line 17.
RoleA beofre at main.pl line 10.
Base at main.pl line 4.
RoleA after at main.pl line 11.
RoleB after at main.pl line 18.
MyClass after at main.pl line 28.

というマトリョーシカな結果になりました。
そーいえばそーだっけかなーって感じで、よくよく考えたらもともとMoose経験浅いボクだったのを思い出しました。