1*898184e3Ssthen#!./perl 2*898184e3Ssthen 3*898184e3Ssthenuse strict; 4*898184e3Ssthenuse warnings; 5*898184e3Ssthenuse utf8; 6*898184e3Ssthenuse open qw( :utf8 :std ); 7*898184e3Ssthen 8*898184e3Ssthenrequire q(./test.pl); plan(tests => 10); 9*898184e3Ssthen 10*898184e3Ssthen=pod 11*898184e3Ssthen 12*898184e3SsthenThis example is take from: http://www.python.org/2.3/mro.html 13*898184e3Ssthen 14*898184e3Ssthen"My first example" 15*898184e3Ssthenclass O: pass 16*898184e3Ssthenclass F(O): pass 17*898184e3Ssthenclass E(O): pass 18*898184e3Ssthenclass D(O): pass 19*898184e3Ssthenclass C(D,F): pass 20*898184e3Ssthenclass B(D,E): pass 21*898184e3Ssthenclass A(B,C): pass 22*898184e3Ssthen 23*898184e3Ssthen 24*898184e3Ssthen 6 25*898184e3Ssthen --- 26*898184e3SsthenLevel 3 | O | (more general) 27*898184e3Ssthen / --- \ 28*898184e3Ssthen / | \ | 29*898184e3Ssthen / | \ | 30*898184e3Ssthen / | \ | 31*898184e3Ssthen --- --- --- | 32*898184e3SsthenLevel 2 3 | D | 4| E | | F | 5 | 33*898184e3Ssthen --- --- --- | 34*898184e3Ssthen \ \ _ / | | 35*898184e3Ssthen \ / \ _ | | 36*898184e3Ssthen \ / \ | | 37*898184e3Ssthen --- --- | 38*898184e3SsthenLevel 1 1 | B | | C | 2 | 39*898184e3Ssthen --- --- | 40*898184e3Ssthen \ / | 41*898184e3Ssthen \ / \ / 42*898184e3Ssthen --- 43*898184e3SsthenLevel 0 0 | A | (more specialized) 44*898184e3Ssthen --- 45*898184e3Ssthen 46*898184e3Ssthen=cut 47*898184e3Ssthen 48*898184e3Ssthen{ 49*898184e3Ssthen package 텟ţ::ᴼ; 50*898184e3Ssthen use mro 'dfs'; 51*898184e3Ssthen 52*898184e3Ssthen package 텟ţ::Ḟ; 53*898184e3Ssthen use mro 'dfs'; 54*898184e3Ssthen use base '텟ţ::ᴼ'; 55*898184e3Ssthen 56*898184e3Ssthen package 텟ţ::ऍ; 57*898184e3Ssthen use base '텟ţ::ᴼ'; 58*898184e3Ssthen use mro 'dfs'; 59*898184e3Ssthen 60*898184e3Ssthen sub ƈ_or_ऍ { '텟ţ::ऍ' } 61*898184e3Ssthen 62*898184e3Ssthen package 텟ţ::Ḋ; 63*898184e3Ssthen use mro 'dfs'; 64*898184e3Ssthen use base '텟ţ::ᴼ'; 65*898184e3Ssthen 66*898184e3Ssthen sub ƈ_or_Ḋ { '텟ţ::Ḋ' } 67*898184e3Ssthen 68*898184e3Ssthen package 텟ţ::ƈ; 69*898184e3Ssthen use base ('텟ţ::Ḋ', '텟ţ::Ḟ'); 70*898184e3Ssthen use mro 'dfs'; 71*898184e3Ssthen 72*898184e3Ssthen sub ƈ_or_Ḋ { '텟ţ::ƈ' } 73*898184e3Ssthen sub ƈ_or_ऍ { '텟ţ::ƈ' } 74*898184e3Ssthen 75*898184e3Ssthen package 텟ţ::ᛒ; 76*898184e3Ssthen use mro 'dfs'; 77*898184e3Ssthen use base ('텟ţ::Ḋ', '텟ţ::ऍ'); 78*898184e3Ssthen 79*898184e3Ssthen package 텟ţ::ଅ; 80*898184e3Ssthen use base ('텟ţ::ᛒ', '텟ţ::ƈ'); 81*898184e3Ssthen use mro 'dfs'; 82*898184e3Ssthen} 83*898184e3Ssthen 84*898184e3Ssthenok(eq_array( 85*898184e3Ssthen mro::get_linear_isa('텟ţ::Ḟ'), 86*898184e3Ssthen [ qw(텟ţ::Ḟ 텟ţ::ᴼ) ] 87*898184e3Ssthen), '... got the right MRO for 텟ţ::Ḟ'); 88*898184e3Ssthen 89*898184e3Ssthenok(eq_array( 90*898184e3Ssthen mro::get_linear_isa('텟ţ::ऍ'), 91*898184e3Ssthen [ qw(텟ţ::ऍ 텟ţ::ᴼ) ] 92*898184e3Ssthen), '... got the right MRO for 텟ţ::ऍ'); 93*898184e3Ssthen 94*898184e3Ssthenok(eq_array( 95*898184e3Ssthen mro::get_linear_isa('텟ţ::Ḋ'), 96*898184e3Ssthen [ qw(텟ţ::Ḋ 텟ţ::ᴼ) ] 97*898184e3Ssthen), '... got the right MRO for 텟ţ::Ḋ'); 98*898184e3Ssthen 99*898184e3Ssthenok(eq_array( 100*898184e3Ssthen mro::get_linear_isa('텟ţ::ƈ'), 101*898184e3Ssthen [ qw(텟ţ::ƈ 텟ţ::Ḋ 텟ţ::ᴼ 텟ţ::Ḟ) ] 102*898184e3Ssthen), '... got the right MRO for 텟ţ::ƈ'); 103*898184e3Ssthen 104*898184e3Ssthenok(eq_array( 105*898184e3Ssthen mro::get_linear_isa('텟ţ::ᛒ'), 106*898184e3Ssthen [ qw(텟ţ::ᛒ 텟ţ::Ḋ 텟ţ::ᴼ 텟ţ::ऍ) ] 107*898184e3Ssthen), '... got the right MRO for 텟ţ::ᛒ'); 108*898184e3Ssthen 109*898184e3Ssthenok(eq_array( 110*898184e3Ssthen mro::get_linear_isa('텟ţ::ଅ'), 111*898184e3Ssthen [ qw(텟ţ::ଅ 텟ţ::ᛒ 텟ţ::Ḋ 텟ţ::ᴼ 텟ţ::ऍ 텟ţ::ƈ 텟ţ::Ḟ) ] 112*898184e3Ssthen), '... got the right MRO for 텟ţ::ଅ'); 113*898184e3Ssthen 114*898184e3Ssthenis(텟ţ::ଅ->ƈ_or_Ḋ, '텟ţ::Ḋ', '... got the expected method output'); 115*898184e3Ssthenis(텟ţ::ଅ->can('ƈ_or_Ḋ')->(), '텟ţ::Ḋ', '... can got the expected method output'); 116*898184e3Ssthenis(텟ţ::ଅ->ƈ_or_ऍ, '텟ţ::ऍ', '... got the expected method output'); 117*898184e3Ssthenis(텟ţ::ଅ->can('ƈ_or_ऍ')->(), '텟ţ::ऍ', '... can got the expected method output'); 118