The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 3;

my @calls;

do {
    package Class;
    use Class::Method::Modifiers;

    sub original { push @calls, 'Class::original' }
    around original => sub { push @calls, 'around Class::original' };
};

Class->original;
is_deeply([splice @calls], [
    'around Class::original',
]);

do {
    package Parent;
    use Class::Method::Modifiers;

    sub original { push @calls, 'Parent::original' }
    around original => sub {
        my $orig = shift;
        push @calls, 'around/before Parent::original';
        $orig->(@_);
        push @calls, 'around/after Parent::original';
    };
};

Parent->original;
is_deeply([splice @calls], [
    'around/before Parent::original',
    'Parent::original',
    'around/after Parent::original',
]);

do {
    package Parent;
    use Class::Method::Modifiers;

    around original => sub {
        my $orig = shift;
        push @calls, '2 around/before Parent::original';
        $orig->(@_);
        push @calls, '2 around/after Parent::original';
    };
};

Parent->original;
is_deeply([splice @calls], [
    '2 around/before Parent::original',
    'around/before Parent::original',
    'Parent::original',
    'around/after Parent::original',
    '2 around/after Parent::original',
]);