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 => 6;

my @calls;

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

    sub original { push @calls, 'Parent::original' }
    before original => sub { push @calls, 'before Parent::original' };
    after  original => sub { push @calls, 'after Parent::original' };
};

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

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

    before original => sub { push @calls, 'before before Parent::original' };
    after  original => sub { push @calls, 'after after Parent::original' };
};

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

do {
    package Child;
    BEGIN { our @ISA = 'Parent' }
};

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

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

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

    before original => sub { push @calls, 'before Child::original' };
    after  original => sub { push @calls, 'after Child::original' };
};

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

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