deprecate bless_instance_structure
[gitmo/Class-MOP.git] / t / 004_advanced_methods.t
CommitLineData
a5eca695 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
8048fe76 6use Test::More tests => 14;
a5eca695 7use Test::Exception;
8
9BEGIN {
10 use_ok('Class::MOP');
11 use_ok('Class::MOP::Class');
12}
13
14=pod
15
16The following class hierarhcy is very contrived
17and totally horrid (it won't work under C3 even),
18but it tests a number of aspect of this module.
19
20A more real-world example would be a nice addition :)
21
22=cut
23
24{
25 package Foo;
26
27 sub BUILD { 'Foo::BUILD' }
28 sub foo { 'Foo::foo' }
29
30 package Bar;
31 our @ISA = ('Foo');
32
33 sub BUILD { 'Bar::BUILD' }
34 sub bar { 'Bar::bar' }
35
36 package Baz;
37 our @ISA = ('Bar');
38
a5eca695 39 sub baz { 'Baz::baz' }
40 sub foo { 'Baz::foo' }
41
42 package Foo::Bar;
43 our @ISA = ('Foo', 'Bar');
44
45 sub BUILD { 'Foo::Bar::BUILD' }
46 sub foobar { 'Foo::Bar::foobar' }
47
48 package Foo::Bar::Baz;
49 our @ISA = ('Foo', 'Bar', 'Baz');
50
51 sub BUILD { 'Foo::Bar::Baz::BUILD' }
52 sub bar { 'Foo::Bar::Baz::bar' }
53 sub foobarbaz { 'Foo::Bar::Baz::foobarbaz' }
54}
55
8048fe76 56ok(!defined(Class::MOP::Class->initialize('Foo')->find_next_method_by_name('BUILD')),
57 '... Foo::BUILD has not next method');
58
59is(Class::MOP::Class->initialize('Bar')->find_next_method_by_name('BUILD'),
60 Class::MOP::Class->initialize('Foo')->get_method('BUILD'),
61 '... Bar::BUILD does have a next method');
62
63is(Class::MOP::Class->initialize('Baz')->find_next_method_by_name('BUILD'),
64 Class::MOP::Class->initialize('Bar')->get_method('BUILD'),
65 '... Baz->BUILD does have a next method');
66
67is(Class::MOP::Class->initialize('Foo::Bar')->find_next_method_by_name('BUILD'),
68 Class::MOP::Class->initialize('Foo')->get_method('BUILD'),
69 '... Foo::Bar->BUILD does have a next method');
70
71is(Class::MOP::Class->initialize('Foo::Bar::Baz')->find_next_method_by_name('BUILD'),
72 Class::MOP::Class->initialize('Foo')->get_method('BUILD'),
73 '... Foo::Bar::Baz->BUILD does have a next method');
74
a5eca695 75is_deeply(
76 [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Foo')->compute_all_applicable_methods() ],
77 [
78 {
79 name => 'BUILD',
80 class => 'Foo',
7855ddba 81 code => Class::MOP::Class->initialize('Foo')->get_method('BUILD')
a5eca695 82 },
83 {
84 name => 'foo',
85 class => 'Foo',
7855ddba 86 code => Class::MOP::Class->initialize('Foo')->get_method('foo')
87 },
a5eca695 88 ],
89 '... got the right list of applicable methods for Foo');
90
91is_deeply(
92 [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Bar')->compute_all_applicable_methods() ],
93 [
94 {
95 name => 'BUILD',
96 class => 'Bar',
7855ddba 97 code => Class::MOP::Class->initialize('Bar')->get_method('BUILD')
a5eca695 98 },
99 {
100 name => 'bar',
101 class => 'Bar',
7855ddba 102 code => Class::MOP::Class->initialize('Bar')->get_method('bar')
a5eca695 103 },
104 {
105 name => 'foo',
106 class => 'Foo',
7855ddba 107 code => Class::MOP::Class->initialize('Foo')->get_method('foo')
a5eca695 108 },
109 ],
110 '... got the right list of applicable methods for Bar');
111
112
113is_deeply(
114 [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Baz')->compute_all_applicable_methods() ],
22286063 115 [
a5eca695 116 {
117 name => 'BUILD',
22286063 118 class => 'Bar',
7855ddba 119 code => Class::MOP::Class->initialize('Bar')->get_method('BUILD')
a5eca695 120 },
121 {
122 name => 'bar',
123 class => 'Bar',
7855ddba 124 code => Class::MOP::Class->initialize('Bar')->get_method('bar')
a5eca695 125 },
126 {
127 name => 'baz',
128 class => 'Baz',
7855ddba 129 code => Class::MOP::Class->initialize('Baz')->get_method('baz')
a5eca695 130 },
131 {
132 name => 'foo',
133 class => 'Baz',
7855ddba 134 code => Class::MOP::Class->initialize('Baz')->get_method('foo')
a5eca695 135 },
136 ],
137 '... got the right list of applicable methods for Baz');
138
139is_deeply(
140 [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Foo::Bar')->compute_all_applicable_methods() ],
141 [
142 {
143 name => 'BUILD',
144 class => 'Foo::Bar',
7855ddba 145 code => Class::MOP::Class->initialize('Foo::Bar')->get_method('BUILD')
a5eca695 146 },
147 {
148 name => 'bar',
149 class => 'Bar',
7855ddba 150 code => Class::MOP::Class->initialize('Bar')->get_method('bar')
a5eca695 151 },
152 {
153 name => 'foo',
154 class => 'Foo',
7855ddba 155 code => Class::MOP::Class->initialize('Foo')->get_method('foo')
a5eca695 156 },
157 {
158 name => 'foobar',
159 class => 'Foo::Bar',
7855ddba 160 code => Class::MOP::Class->initialize('Foo::Bar')->get_method('foobar')
a5eca695 161 },
162 ],
163 '... got the right list of applicable methods for Foo::Bar');
164
165is_deeply(
166 [ sort { $a->{name} cmp $b->{name} } Class::MOP::Class->initialize('Foo::Bar::Baz')->compute_all_applicable_methods() ],
167 [
168 {
169 name => 'BUILD',
170 class => 'Foo::Bar::Baz',
7855ddba 171 code => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('BUILD')
a5eca695 172 },
173 {
174 name => 'bar',
175 class => 'Foo::Bar::Baz',
7855ddba 176 code => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('bar')
a5eca695 177 },
178 {
179 name => 'baz',
180 class => 'Baz',
7855ddba 181 code => Class::MOP::Class->initialize('Baz')->get_method('baz')
a5eca695 182 },
183 {
184 name => 'foo',
185 class => 'Foo',
7855ddba 186 code => Class::MOP::Class->initialize('Foo')->get_method('foo')
a5eca695 187 },
188 {
189 name => 'foobarbaz',
190 class => 'Foo::Bar::Baz',
7855ddba 191 code => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('foobarbaz')
a5eca695 192 },
193 ],
194 '... got the right list of applicable methods for Foo::Bar::Baz');
195
196## find_all_methods_by_name
197
198is_deeply(
199 [ Class::MOP::Class->initialize('Foo::Bar')->find_all_methods_by_name('BUILD') ],
200 [
201 {
202 name => 'BUILD',
203 class => 'Foo::Bar',
7855ddba 204 code => Class::MOP::Class->initialize('Foo::Bar')->get_method('BUILD')
a5eca695 205 },
206 {
207 name => 'BUILD',
208 class => 'Foo',
7855ddba 209 code => Class::MOP::Class->initialize('Foo')->get_method('BUILD')
a5eca695 210 },
211 {
212 name => 'BUILD',
213 class => 'Bar',
7855ddba 214 code => Class::MOP::Class->initialize('Bar')->get_method('BUILD')
a5eca695 215 }
216 ],
217 '... got the right list of BUILD methods for Foo::Bar');
218
219is_deeply(
220 [ Class::MOP::Class->initialize('Foo::Bar::Baz')->find_all_methods_by_name('BUILD') ],
221 [
222 {
223 name => 'BUILD',
224 class => 'Foo::Bar::Baz',
7855ddba 225 code => Class::MOP::Class->initialize('Foo::Bar::Baz')->get_method('BUILD')
a5eca695 226 },
227 {
228 name => 'BUILD',
229 class => 'Foo',
7855ddba 230 code => Class::MOP::Class->initialize('Foo')->get_method('BUILD')
a5eca695 231 },
232 {
233 name => 'BUILD',
234 class => 'Bar',
7855ddba 235 code => Class::MOP::Class->initialize('Bar')->get_method('BUILD')
22286063 236 },
a5eca695 237 ],
238 '... got the right list of BUILD methods for Foo::Bar::Baz');