Commit | Line | Data |
38bf2a25 |
1 | use strict; |
2 | use warnings; |
3 | |
4 | use Test::More; |
5 | use File::Spec; |
6 | use Class::MOP; |
7 | |
8 | use Test::Requires { |
9 | 'Algorithm::C3' => '0.01', # skip all if not installed |
10 | }; |
11 | |
12 | BEGIN { |
13 | require_ok(File::Spec->catfile('examples', 'C3MethodDispatchOrder.pod')); |
14 | } |
15 | |
16 | { |
17 | package Diamond_A; |
18 | use metaclass 'C3MethodDispatchOrder'; |
19 | |
20 | sub hello { 'Diamond_A::hello' } |
21 | |
22 | package Diamond_B; |
23 | use metaclass 'C3MethodDispatchOrder'; |
24 | __PACKAGE__->meta->superclasses('Diamond_A'); |
25 | |
26 | package Diamond_C; |
27 | use metaclass 'C3MethodDispatchOrder'; |
28 | __PACKAGE__->meta->superclasses('Diamond_A'); |
29 | |
30 | sub hello { 'Diamond_C::hello' } |
31 | |
32 | package Diamond_D; |
33 | use metaclass 'C3MethodDispatchOrder'; |
34 | __PACKAGE__->meta->superclasses('Diamond_B', 'Diamond_C'); |
35 | } |
36 | |
37 | is_deeply( |
38 | [ Diamond_D->meta->class_precedence_list ], |
39 | [ qw(Diamond_D Diamond_B Diamond_C Diamond_A) ], |
40 | '... got the right MRO for Diamond_D'); |
41 | |
42 | is(Diamond_D->hello, 'Diamond_C::hello', '... got the right dispatch order'); |
43 | is(Diamond_D->can('hello')->(), 'Diamond_C::hello', '... can(method) resolved itself as expected'); |
44 | |
45 | done_testing; |