1#!./perl
2
3use strict;
4use warnings;
5use utf8;
6use open qw( :utf8 :std );
7
8require q(./test.pl); plan(tests => 4);
9
10=pod
11
12This example is take from: http://www.python.org/2.3/mro.html
13
14"My second example"
15class O: pass
16class F(O): pass
17class E(O): pass
18class D(O): pass
19class C(D,F): pass
20class B(E,D): pass
21class A(B,C): pass
22
23                           6
24                          ---
25Level 3                  | O |
26                       /  ---  \
27                      /    |    \
28                     /     |     \
29                    /      |      \
30                  ---     ---    ---
31Level 2        2 | E | 4 | D |  | F | 5
32                  ---     ---    ---
33                   \      / \     /
34                    \    /   \   /
35                     \  /     \ /
36                      ---     ---
37Level 1            1 | B |   | C | 3
38                      ---     ---
39                       \       /
40                        \     /
41                          ---
42Level 0                0 | A |
43                          ---
44
45>>> A.mro()
46(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>,
47<class '__main__.C'>, <class '__main__.D'>, <class '__main__.F'>,
48<type 'object'>)
49
50=cut
51
52{
53    package �����::���;
54    use mro 'c3';
55    
56    sub ���_or_��� { '�����::���' }
57    sub ���_or_��� { '�����::���' }    
58    
59    package �����::���;
60    use base '�����::���';
61    use mro 'c3';
62    
63    sub ���_or_��� { '�����::���' }    
64    
65    package �����::���;
66    use base '�����::���';
67    use mro 'c3';
68        
69    package �����::���;
70    use base '�����::���';    
71    use mro 'c3';
72    
73    sub ���_or_��� { '�����::���' }
74    sub ��_or_��� { '�����::���' }
75        
76    package �����::��;
77    use base ('�����::���', '�����::���');
78    use mro 'c3';    
79
80    sub ��_or_��� { '�����::��' }
81    
82    package �����::���;
83    use base ('�����::���', '�����::���');
84    use mro 'c3';
85        
86    package �����::���;
87    use base ('�����::���', '�����::��');
88    use mro 'c3';
89}
90
91ok(eq_array(
92    mro::get_linear_isa('�����::���'),
93    [ qw(�����::��� �����::��� �����::��� �����::�� �����::��� �����::��� �����::���) ]
94), '... got the right MRO for �����::���');      
95    
96is(�����::���->���_or_���, '�����::���', '... got the right method dispatch');    
97is(�����::���->���_or_���, '�����::���', '... got the right method dispatch');   
98
99# NOTE: 
100# this test is particularly interesting because the p5 dispatch
101# would actually call �����::��� before �����::�� and �����::��� is a
102# subclass of �����::�� 
103is(�����::���->��_or_���, '�����::��', '... got the right method dispatch');    
104