#!perl

use 5.10.0;

sub update_track {
    my $orig = shift;
    my $target = caller;
    return &$orig, $target;
}

package R0 {

    use Moo::Role;

    sub track { shift->maybe::next::method( @_ ); }
}

package R1 {

    use Moo::Role;
    with 'R0';

    around track => sub { &::update_track };
}

package C1 {

    use Moo;
    with 'R1';

    around track => sub { &::update_track };
}

package C2 {

    use Moo;
    extends 'C1';

    around track => sub { &::update_track };
}

package C3 {

    use Moo;
    with 'R0';
    extends 'C1';

    around track => sub { &::update_track };
}


$, = "\t";

say "C1: ", C1->new->track;
say "C2: ", C2->new->track;
say "C3: ", C3->new->track;

