use strict;
use warnings;
use Test::More tests => 5;
BEGIN {
use_ok('Coat');
}
my @list;
my @expected = ('before1:Perl',
'before2:Perl',
'before3:Perl',
'around2:Perl',
'around:before:Perl', 'Perl', 'around:after:Perl',
'around3:Perl',
'after1:Perl',
'after2:Perl',
'after3:Perl',
);
{
package Parent;
use Coat;
sub pushelem { push @list, $_[1] }
package Child;
use Coat;
extends 'Parent';
before 'pushelem' => sub {
my ($self, $elem) = @_;
push @list, "before1:$elem";
};
before 'pushelem' => sub {
my ($self, $elem) = @_;
push @list, "before2:$elem";
};
before 'pushelem' => sub {
my ($self, $elem) = @_;
push @list, "before3:$elem";
};
after 'pushelem' => sub {
my ($self, $elem) = @_;
push @list, "after1:$elem";
};
around 'pushelem' => sub {
my $orig = shift;
my ($self, $elem) = @_;
push @list, "around:before:$elem";
$self->$orig($elem);
push @list, "around:after:$elem";
};
around 'pushelem' => sub {
my $orig = shift;
my ($self, $elem) = @_;
push @list, "around2:$elem";
$self->$orig($elem);
};
around 'pushelem' => sub {
my $orig = shift;
my ($self, $elem) = @_;
$self->$orig($elem);
push @list, "around3:$elem";
};
after 'pushelem' => sub {
my ($self, $elem) = @_;
push @list, "after2:$elem";
};
after 'pushelem' => sub {
my ($self, $elem) = @_;
push @list, "after3:$elem";
};
}
my $parent = new Parent;
isa_ok($parent, 'Parent');
my $child = new Child;
isa_ok($child, 'Child');
@list = ();
$parent->pushelem('Perl');
is_deeply(\@list, ['Perl'], 'Parent pushed correctly');
@list = ();
$child->pushelem('Perl');
is_deeply(\@list, \@expected, 'Child pushed correctly');