Include method name in immutable methods (fixes #49680)
[gitmo/Class-MOP.git] / t / 023_attribute_get_read_write.t
CommitLineData
d14f6cbe 1use strict;
2use warnings;
3
4use Scalar::Util 'blessed', 'reftype';
5
efd3d14c 6use Test::More tests => 36;
d14f6cbe 7
efd3d14c 8use Class::MOP;
d14f6cbe 9
10=pod
11
12This checks the get_read/write_method
13and get_read/write_method_ref methods
14
15=cut
16
17{
18 package Foo;
19 use metaclass;
20
21 Foo->meta->add_attribute('bar' =>
22 reader => 'get_bar',
23 writer => 'set_bar',
24 );
25
26 Foo->meta->add_attribute('baz' =>
27 accessor => 'baz',
28 );
29
30 Foo->meta->add_attribute('gorch' =>
31 reader => { 'get_gorch', => sub { (shift)->{gorch} } }
32 );
ad074154 33
34 package Bar;
35 use metaclass;
36 Bar->meta->superclasses('Foo');
37
38 Bar->meta->add_attribute('quux' =>
39 accessor => 'quux',
40 );
d14f6cbe 41}
42
43can_ok('Foo', 'get_bar');
44can_ok('Foo', 'set_bar');
45can_ok('Foo', 'baz');
46can_ok('Foo', 'get_gorch');
47
48ok(Foo->meta->has_attribute('bar'), '... Foo has the attribute bar');
49ok(Foo->meta->has_attribute('baz'), '... Foo has the attribute baz');
50ok(Foo->meta->has_attribute('gorch'), '... Foo has the attribute gorch');
51
52my $bar_attr = Foo->meta->get_attribute('bar');
53my $baz_attr = Foo->meta->get_attribute('baz');
54my $gorch_attr = Foo->meta->get_attribute('gorch');
55
56is($bar_attr->reader, 'get_bar', '... the bar attribute has the reader get_bar');
57is($bar_attr->writer, 'set_bar', '... the bar attribute has the writer set_bar');
58is($bar_attr->associated_class, Foo->meta, '... and the bar attribute is associated with Foo->meta');
59
60is($bar_attr->get_read_method, 'get_bar', '... $attr does have an read method');
61is($bar_attr->get_write_method, 'set_bar', '... $attr does have an write method');
62
63{
64 my $reader = $bar_attr->get_read_method_ref;
65 my $writer = $bar_attr->get_write_method_ref;
66
67 isa_ok($reader, 'Class::MOP::Method');
68 isa_ok($writer, 'Class::MOP::Method');
69
70 is($reader->fully_qualified_name, 'Foo::get_bar', '... it is the sub we are looking for');
71 is($writer->fully_qualified_name, 'Foo::set_bar', '... it is the sub we are looking for');
72
73 is(reftype($reader->body), 'CODE', '... it is a plain old sub');
74 is(reftype($writer->body), 'CODE', '... it is a plain old sub');
75}
76
77is($baz_attr->accessor, 'baz', '... the bar attribute has the accessor baz');
78is($baz_attr->associated_class, Foo->meta, '... and the bar attribute is associated with Foo->meta');
79
80is($baz_attr->get_read_method, 'baz', '... $attr does have an read method');
81is($baz_attr->get_write_method, 'baz', '... $attr does have an write method');
82
83{
84 my $reader = $baz_attr->get_read_method_ref;
85 my $writer = $baz_attr->get_write_method_ref;
86
87 isa_ok($reader, 'Class::MOP::Method');
88 isa_ok($writer, 'Class::MOP::Method');
89
90 is($reader, $writer, '... they are the same method');
91
92 is($reader->fully_qualified_name, 'Foo::baz', '... it is the sub we are looking for');
93 is($writer->fully_qualified_name, 'Foo::baz', '... it is the sub we are looking for');
94}
95
96is(ref($gorch_attr->reader), 'HASH', '... the gorch attribute has the reader get_gorch (HASH ref)');
97is($gorch_attr->associated_class, Foo->meta, '... and the gorch attribute is associated with Foo->meta');
98
99is($gorch_attr->get_read_method, 'get_gorch', '... $attr does have an read method');
100ok(!$gorch_attr->get_write_method, '... $attr does not have an write method');
101
102{
103 my $reader = $gorch_attr->get_read_method_ref;
104 my $writer = $gorch_attr->get_write_method_ref;
105
106 isa_ok($reader, 'Class::MOP::Method');
def5c0b5 107 ok(blessed($writer), '... it is not a plain old sub');
108 isa_ok($writer, 'Class::MOP::Method');
d14f6cbe 109
110 is($reader->fully_qualified_name, 'Foo::get_gorch', '... it is the sub we are looking for');
def5c0b5 111 is($writer->fully_qualified_name, 'Foo::__ANON__', '... it is the sub we are looking for');
d14f6cbe 112}