The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -T

use strict;
use warnings;
use lib 't';

use Test::More;

eval " use YAML ";
plan skip_all => "YAML is not installed." if $@;
plan 'no_plan';

use MyClass;
for my $plugin (qw/ AliasMethod AliasMethod2 /) {
    my $obj = MyClass->new({ load_plugins => [$plugin] });
    is $obj->call('bar'), 'baz';

    MyClass->load_components(qw/ Autocall::InjectMethod /);
    my $obj2 = MyClass->new({ load_plugins => [$plugin] });
    is $obj2->bar, 'baz';
    clear_isa();
    { no strict 'refs'; delete ${'MyClass::'}{bar}; }

    MyClass->load_components(qw/ Autocall::SingletonMethod /);
    my $obj3 = MyClass->new({ load_plugins => [$plugin] });
    is $obj3->bar, 'baz';
    clear_isa();
    { no strict 'refs'; delete ${'MyClass::_Singletons::0::'}{bar}; }

    MyClass->load_components(qw/ Autocall::Autoload /);
    my $obj4 = MyClass->new({ load_plugins => [$plugin] });
    is $obj4->bar, 'baz';
    clear_isa();
}

sub clear_isa {
    @MyClass::ISA = ('Class::Component');
    for my $key (keys %{ Class::Component::Implement->default_components } ) {
        delete Class::Component::Implement->default_components->{$key};
    }
}