4963a569f2a5cbb8c37e5c02a7eb1169a1094dee
[gitmo/Moose.git] / t / cmop / anon_class_keep_alive.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use Test::Fatal;
6
7 use Class::MOP;
8
9 my $anon_class_name;
10 my $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;
23     $anon_meta_name = Scalar::Util::blessed($anon_class);
24     $anon_class->add_attribute( $_, reader => $_ ) for qw/bar baz/;
25
26     my $obj = $anon_class->new_object(bar => 'a', baz => 'b');
27     return $obj;
28   }
29
30   sub foo{ 'foo' }
31
32   1;
33 }
34
35 my $instance = Foo->make_anon_instance;
36
37 isa_ok($instance, $anon_class_name);
38 isa_ok($instance->meta, $anon_meta_name);
39 isa_ok($instance, 'Foo', '... Anonymous instance isa Foo');
40
41 ok($instance->can('foo'), '... Anonymous instance can foo');
42 ok($instance->meta->find_method_by_name('foo'), '... Anonymous instance has method foo');
43
44 ok($instance->meta->has_attribute('bar'), '... Anonymous instance still has attribute bar');
45 ok($instance->meta->has_attribute('baz'), '... Anonymous instance still has attribute baz');
46 is($instance->bar, 'a', '... Anonymous instance still has correct bar value');
47 is($instance->baz, 'b', '... Anonymous instance still has correct baz value');
48
49 is_deeply([$instance->meta->class_precedence_list],
50           [$anon_class_name, 'Foo'],
51           '... Anonymous instance has class precedence list',
52          );
53
54 done_testing;