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