Merge branch 'stable'
[gitmo/Class-MOP.git] / t / 019_anon_class_keep_alive.t
CommitLineData
a06797b0 1use strict;
2use warnings;
3
86a4d873 4use Test::More;
871e9eb5 5use Test::Fatal;
a06797b0 6
efd3d14c 7use Class::MOP;
a06797b0 8
9my $anon_class_name;
10my $anon_meta_name;
11{
12 package Foo;
13 use strict;
14 use warnings;
15 use metaclass;
16
17 sub make_anon_instance{
18 my $self = shift;
19 my $class = ref $self || $self;
20
21 my $anon_class = Class::MOP::Class->create_anon_class(superclasses => [$class]);
22 $anon_class_name = $anon_class->name;
11b56828 23 $anon_meta_name = Scalar::Util::blessed($anon_class);
a06797b0 24 $anon_class->add_attribute( $_, reader => $_ ) for qw/bar baz/;
25
26 my $obj = $anon_class->new_object(bar => 'a', baz => 'b');
a06797b0 27 return $obj;
28 }
29
30 sub foo{ 'foo' }
31
32 1;
33}
34
35my $instance = Foo->make_anon_instance;
36
37isa_ok($instance, $anon_class_name);
38isa_ok($instance->meta, $anon_meta_name);
39isa_ok($instance, 'Foo', '... Anonymous instance isa Foo');
40
41ok($instance->can('foo'), '... Anonymous instance can foo');
42ok($instance->meta->find_method_by_name('foo'), '... Anonymous instance has method foo');
43
44ok($instance->meta->has_attribute('bar'), '... Anonymous instance still has attribute bar');
45ok($instance->meta->has_attribute('baz'), '... Anonymous instance still has attribute baz');
46is($instance->bar, 'a', '... Anonymous instance still has correct bar value');
47is($instance->baz, 'b', '... Anonymous instance still has correct baz value');
48
49is_deeply([$instance->meta->class_precedence_list],
50 [$anon_class_name, 'Foo'],
51 '... Anonymous instance has class precedence list',
52 );
86a4d873 53
54done_testing;