Fix a bug about immutablizing anonymous classes
[gitmo/Mouse.git] / t / 020_attributes / 007_attribute_custom_metaclass.t
CommitLineData
4060c871 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More tests => 16;
7use Test::Exception;
8
9
10
11{
12 package Foo::Meta::Attribute;
13 use Mouse;
14
15 extends 'Mouse::Meta::Attribute';
16
17 around 'new' => sub {
18 my $next = shift;
19 my $self = shift;
20 my $name = shift;
21 $next->($self, $name, (is => 'rw', isa => 'Foo'), @_);
22 };
23
24 package Foo;
25 use Mouse;
26
27 has 'foo' => (metaclass => 'Foo::Meta::Attribute');
28}
29{
30 my $foo = Foo->new;
31 isa_ok($foo, 'Foo');
32
33 my $foo_attr = Foo->meta->get_attribute('foo');
34 isa_ok($foo_attr, 'Foo::Meta::Attribute');
35 isa_ok($foo_attr, 'Mouse::Meta::Attribute');
36
37 is($foo_attr->name, 'foo', '... got the right name for our meta-attribute');
38 ok($foo_attr->has_accessor, '... our meta-attrubute created the accessor for us');
39
40 ok($foo_attr->has_type_constraint, '... our meta-attrubute created the type_constraint for us');
41
42 my $foo_attr_type_constraint = $foo_attr->type_constraint;
43 isa_ok($foo_attr_type_constraint, 'Mouse::Meta::TypeConstraint');
44
45 is($foo_attr_type_constraint->name, 'Foo', '... got the right type constraint name');
46
47 local $TODO = '$type_constraint->parent is not reliable';
48 is($foo_attr_type_constraint->parent, 'Object', '... got the right type constraint parent name');
49}
50{
51 package Bar::Meta::Attribute;
52 use Mouse;
53
54 #extends 'Class::MOP::Attribute';
55 extends 'Mouse::Meta::Attribute';
56
57 package Bar;
58 use Mouse;
59
60 ::lives_ok {
61 has 'bar' => (metaclass => 'Bar::Meta::Attribute');
62 } '... the attribute metaclass need not be a Mouse::Meta::Attribute as long as it behaves';
63}
64
65{
66 package Mouse::Meta::Attribute::Custom::Foo;
67 sub register_implementation { 'Foo::Meta::Attribute' }
68
69 package Mouse::Meta::Attribute::Custom::Bar;
70 use Mouse;
71
72 extends 'Mouse::Meta::Attribute';
73
74 package Another::Foo;
75 use Mouse;
76
77 ::lives_ok {
78 has 'foo' => (metaclass => 'Foo');
79 } '... the attribute metaclass alias worked correctly';
80
81 ::lives_ok {
82 has 'bar' => (metaclass => 'Bar', is => 'bare');
83 } '... the attribute metaclass alias worked correctly';
84}
85
86{
87 my $foo_attr = Another::Foo->meta->get_attribute('foo');
88 isa_ok($foo_attr, 'Foo::Meta::Attribute');
89 isa_ok($foo_attr, 'Mouse::Meta::Attribute');
90
91 my $bar_attr = Another::Foo->meta->get_attribute('bar');
92 isa_ok($bar_attr, 'Mouse::Meta::Attribute::Custom::Bar');
93 isa_ok($bar_attr, 'Mouse::Meta::Attribute');
94}
95
96