Skip distro which requires rpm
[gitmo/Moose.git] / t / basics / create_anon.t
CommitLineData
6d5cbd2b 1#!/usr/bin/perl
2
17594769 3use strict;
4use warnings;
6d5cbd2b 5
a28e50e4 6use Test::More;
17594769 7
7ff56534 8use Moose::Meta::Class;
17594769 9
d03bd989 10{
17594769 11 package Class;
12 use Moose;
d03bd989 13
17594769 14 package Foo;
15 use Moose::Role;
16 sub foo_role_applied { 1 }
d03bd989 17
17594769 18 package Bar;
19 use Moose::Role;
20 sub bar_role_applied { 1 }
21}
22
23# try without caching first
24
25{
26 my $class_and_foo_1 = Moose::Meta::Class->create_anon_class(
27 superclasses => ['Class'],
28 roles => ['Foo'],
29 );
d03bd989 30
17594769 31 my $class_and_foo_2 = Moose::Meta::Class->create_anon_class(
32 superclasses => ['Class'],
33 roles => ['Foo'],
34 );
d03bd989 35
17594769 36 isnt $class_and_foo_1->name, $class_and_foo_2->name,
37 'creating the same class twice without caching results in 2 classes';
38
39 map { ok $_->name->foo_role_applied } ($class_and_foo_1, $class_and_foo_2);
40}
41
42# now try with caching
43
44{
45 my $class_and_foo_1 = Moose::Meta::Class->create_anon_class(
46 superclasses => ['Class'],
47 roles => ['Foo'],
48 cache => 1,
49 );
d03bd989 50
17594769 51 my $class_and_foo_2 = Moose::Meta::Class->create_anon_class(
52 superclasses => ['Class'],
53 roles => ['Foo'],
54 cache => 1,
55 );
d03bd989 56
17594769 57 is $class_and_foo_1->name, $class_and_foo_2->name,
58 'with cache, the same class is the same class';
d03bd989 59
17594769 60 map { ok $_->name->foo_role_applied } ($class_and_foo_1, $class_and_foo_2);
d03bd989 61
17594769 62 my $class_and_bar = Moose::Meta::Class->create_anon_class(
63 superclasses => ['Class'],
64 roles => ['Bar'],
65 cache => 1,
66 );
67
68 isnt $class_and_foo_1->name, $class_and_bar,
69 'class_and_foo and class_and_bar are different';
d03bd989 70
17594769 71 ok $class_and_bar->name->bar_role_applied;
72}
a28e50e4 73
cf600c83 74# This tests that a cached metaclass can be reinitialized and still retain its
75# metaclass object.
76{
77 my $name = Moose::Meta::Class->create_anon_class(
78 superclasses => ['Class'],
79 cache => 1,
80 )->name;
81
82 $name->meta->reinitialize( $name );
83
84 can_ok( $name, 'meta' );
85}
86
dcc8dc06 87{
88 my $name;
89 {
90 my $meta = Moose::Meta::Class->create_anon_class(
91 superclasses => ['Class'],
92 cache => 1,
93 );
94 $name = $meta->name;
95 ok(!Class::MOP::metaclass_is_weak($name), "cache implies weaken => 0");
96 }
97 ok(Class::MOP::class_of($name), "cache implies weaken => 0");
98 Class::MOP::remove_metaclass_by_name($name);
99}
100
101{
102 my $name;
103 {
104 my $meta = Moose::Meta::Class->create_anon_class(
105 superclasses => ['Class'],
106 cache => 1,
107 weaken => 1,
108 );
109 my $name = $meta->name;
110 ok(Class::MOP::metaclass_is_weak($name), "but we can override this");
111 }
112 ok(!Class::MOP::class_of($name), "but we can override this");
dcc8dc06 113}
114
115{
116 my $meta = Moose::Meta::Class->create_anon_class(
117 superclasses => ['Class'],
118 cache => 1,
119 );
120 ok(!Class::MOP::metaclass_is_weak($meta->name),
121 "creates a nonweak metaclass");
122 Scalar::Util::weaken($meta);
123 Class::MOP::remove_metaclass_by_name($meta->name);
124 ok(!$meta, "removing a cached anon class means it's actually gone");
125}
126
a28e50e4 127done_testing;