use strict;
use warnings;
use Test::More;
use Class::MOP;
my $anon_class_name;
my $anon_meta_name;
{
package Foo;
use strict;
use warnings;
use metaclass;
sub make_anon_instance{
my $self = shift;
my $class = ref $self || $self;
my $anon_class = Class::MOP::Class->create_anon_class(superclasses => [$class]);
$anon_class_name = $anon_class->name;
$anon_meta_name = Scalar::Util::blessed($anon_class);
$anon_class->add_attribute( $_, reader => $_ ) for qw/bar baz/;
my $obj = $anon_class->new_object(bar => 'a', baz => 'b');
return $obj;
}
sub foo{ 'foo' }
1;
}
my $instance = Foo->make_anon_instance;
isa_ok($instance, $anon_class_name);
isa_ok($instance->meta, $anon_meta_name);
isa_ok($instance, 'Foo', '... Anonymous instance isa Foo');
ok($instance->can('foo'), '... Anonymous instance can foo');
ok($instance->meta->find_method_by_name('foo'), '... Anonymous instance has method foo');
ok($instance->meta->has_attribute('bar'), '... Anonymous instance still has attribute bar');
ok($instance->meta->has_attribute('baz'), '... Anonymous instance still has attribute baz');
is($instance->bar, 'a', '... Anonymous instance still has correct bar value');
is($instance->baz, 'b', '... Anonymous instance still has correct baz value');
is_deeply([$instance->meta->class_precedence_list],
[$anon_class_name, 'Foo'],
'... Anonymous instance has class precedence list',
);
done_testing;