package Aspect::tests::Weaver;
use strict;
use warnings;
use Carp;
use Test::More;
use Aspect::Weaver;
use base qw(Test::Class);
my $Demo_Class = 'Aspect_Weaver_Foo';
sub setup: Test(setup) { shift->{subject} = Aspect::Weaver->new }
sub get_sub_names: Test(4) {
my $self = shift;
my $subject = $self->{subject};
my %names = map { $_ => 1 } $subject->get_sub_names;
ok $names{"${Demo_Class}::new"}, 'new';
ok $names{"${Demo_Class}::foo"}, 'foo';
ok !$names{'NonExisingClass::non_existing_method'}, 'non existing';
ok !$names{'Aspect::Weaver::install'}, 'Aspect package method';
}
sub install {
my $self = shift;
my $subject = $self->{subject};
my $foo = $Demo_Class->new;
is $foo->foo(2), 3, 'not yet installed';
{
my $hook1 = $subject->install(before =>
"${Demo_Class}::foo", sub { splice @{$_[0]}, 1, 1, $_[0]->[1] + 1 }
);
is $foo->foo(2), 4, 'pre increase second parameter';
my $hook2 = $subject->install(after =>
"${Demo_Class}::foo", sub { $_[-1]++ }
);
is $foo->foo(2), 5, 'post increase return value';
}
is $foo->foo(3), 4, 'now uninstalled';
}
# -----------------------------------------------------------------------------
package Aspect_Weaver_Foo;
sub new { bless {}, shift }
sub foo { $_[1] + 1 }
1;