11 use base 'Class::MOP::Class';
14 my ( $package, %options ) = @_;
15 ::cmp_ok( $options{foo}, 'eq', 'this',
16 'option passed to initialize() on create_anon_class()' );
17 return $class->SUPER::initialize( @_ );
23 my $anon = MyMeta->create_anon_class( foo => 'this' );
24 isa_ok( $anon, 'MyMeta' );
30 my $meta = Class::MOP::Class->create_anon_class;
31 $instance = $meta->new_object;
34 my $meta = Class::MOP::class_of($instance);
35 Scalar::Util::weaken($meta);
36 ok($meta, "anon class is kept alive by existing instances");
39 ok(!$meta, "anon class is collected once instances go away");
43 my $meta = Class::MOP::Class->create_anon_class;
44 $meta->make_immutable;
45 $instance = $meta->name->new;
48 my $meta = Class::MOP::class_of($instance);
49 Scalar::Util::weaken($meta);
50 ok($meta, "anon class is kept alive by existing instances (immutable)");
53 ok(!$meta, "anon class is collected once instances go away (immutable)");
57 $instance = Class::MOP::Class->create('Foo')->new_object;
58 my $meta = Class::MOP::Class->create_anon_class(superclasses => ['Foo']);
59 $meta->rebless_instance($instance);
62 my $meta = Class::MOP::class_of($instance);
63 Scalar::Util::weaken($meta);
64 ok($meta, "anon class is kept alive by existing instances");
67 ok(!$meta, "anon class is collected once instances go away");
72 my $meta = Class::MOP::Class->create_anon_class;
74 my $submeta = Class::MOP::Class->create_anon_class(
75 superclasses => [$meta->name]
77 $instance = $submeta->new_object;
80 my $submeta = Class::MOP::class_of($instance);
81 Scalar::Util::weaken($submeta);
82 ok($submeta, "anon class is kept alive by existing instances");
84 $meta->rebless_instance_back($instance);
85 ok(!$submeta, "reblessing away loses the metaclass");
89 my $meta = Class::MOP::class_of($instance);
90 Scalar::Util::weaken($meta);
91 ok($meta, "anon class is kept alive by existing instances");
95 my $submeta = Class::MOP::Class->create_anon_class(
96 superclasses => [Class::MOP::Class->create_anon_class->name],
98 my @superclasses = $submeta->superclasses;
99 ok(Class::MOP::class_of($superclasses[0]),
100 "superclasses are kept alive by their subclasses");
106 my $meta = Class::MOP::Class->create_anon_class(
107 superclasses => ['Class::MOP::Class'],
109 $meta_name = $meta->name;
110 ok(Class::MOP::metaclass_is_weak($meta_name),
111 "default is for anon metaclasses to be weakened");
113 ok(!Class::MOP::class_of($meta_name),
114 "and weak metaclasses go away when all refs do");
116 my $meta = Class::MOP::Class->create_anon_class(
117 superclasses => ['Class::MOP::Class'],
120 $meta_name = $meta->name;
121 ok(!Class::MOP::metaclass_is_weak($meta_name),
122 "anon classes can be told not to weaken");
124 ok(Class::MOP::class_of($meta_name), "metaclass still exists");
128 $bar_meta = $meta_name->initialize('Bar');
129 }, "we can use the name on its own";
130 isa_ok($bar_meta, $meta_name);
135 my $meta = Class::MOP::Class->create(
139 $instance = $meta->new_object;
142 my $meta = Class::MOP::class_of($instance);
143 Scalar::Util::weaken($meta);
144 ok($meta, "weak class is kept alive by existing instances");
147 ok(!$meta, "weak class is collected once instances go away");