1*898184e3Ssthen#!/usr/bin/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 => 5); 9*898184e3Ssthen 10*898184e3Ssthen=pod 11*898184e3Ssthen 12*898184e3SsthenThis tests the classic diamond inheritance pattern. 13*898184e3Ssthen 14*898184e3Ssthen <A> 15*898184e3Ssthen / \ 16*898184e3Ssthen<B> <C> 17*898184e3Ssthen \ / 18*898184e3Ssthen <D> 19*898184e3Ssthen 20*898184e3Ssthen=cut 21*898184e3Ssthen 22*898184e3Ssthen{ 23*898184e3Ssthen package Diӑmond_A; 24*898184e3Ssthen use mro 'c3'; 25*898184e3Ssthen sub 헬ฬ { 'Diӑmond_A::헬ฬ' } 26*898184e3Ssthen sub fಓ { 'Diӑmond_A::fಓ' } 27*898184e3Ssthen} 28*898184e3Ssthen{ 29*898184e3Ssthen package Diӑmond_B; 30*898184e3Ssthen use base 'Diӑmond_A'; 31*898184e3Ssthen use mro 'c3'; 32*898184e3Ssthen sub fಓ { 'Diӑmond_B::fಓ => ' . (shift)->next::method() } 33*898184e3Ssthen} 34*898184e3Ssthen{ 35*898184e3Ssthen package Diӑmond_C; 36*898184e3Ssthen use mro 'c3'; 37*898184e3Ssthen use base 'Diӑmond_A'; 38*898184e3Ssthen 39*898184e3Ssthen sub 헬ฬ { 'Diӑmond_C::헬ฬ => ' . (shift)->next::method() } 40*898184e3Ssthen sub fಓ { 'Diӑmond_C::fಓ => ' . (shift)->next::method() } 41*898184e3Ssthen} 42*898184e3Ssthen{ 43*898184e3Ssthen package Diӑmond_D; 44*898184e3Ssthen use base ('Diӑmond_B', 'Diӑmond_C'); 45*898184e3Ssthen use mro 'c3'; 46*898184e3Ssthen 47*898184e3Ssthen sub fಓ { 'Diӑmond_D::fಓ => ' . (shift)->next::method() } 48*898184e3Ssthen} 49*898184e3Ssthen 50*898184e3Ssthenok(eq_array( 51*898184e3Ssthen mro::get_linear_isa('Diӑmond_D'), 52*898184e3Ssthen [ qw(Diӑmond_D Diӑmond_B Diӑmond_C Diӑmond_A) ] 53*898184e3Ssthen), '... got the right MRO for Diӑmond_D'); 54*898184e3Ssthen 55*898184e3Ssthenis(Diӑmond_D->헬ฬ, 'Diӑmond_C::헬ฬ => Diӑmond_A::헬ฬ', '... method resolved itself as expected'); 56*898184e3Ssthen 57*898184e3Ssthenis(Diӑmond_D->can('헬ฬ')->('Diӑmond_D'), 58*898184e3Ssthen 'Diӑmond_C::헬ฬ => Diӑmond_A::헬ฬ', 59*898184e3Ssthen '... can(method) resolved itself as expected'); 60*898184e3Ssthen 61*898184e3Ssthenis(UNIVERSAL::can("Diӑmond_D", '헬ฬ')->('Diӑmond_D'), 62*898184e3Ssthen 'Diӑmond_C::헬ฬ => Diӑmond_A::헬ฬ', 63*898184e3Ssthen '... can(method) resolved itself as expected'); 64*898184e3Ssthen 65*898184e3Ssthenis(Diӑmond_D->fಓ, 66*898184e3Ssthen 'Diӑmond_D::fಓ => Diӑmond_B::fಓ => Diӑmond_C::fಓ => Diӑmond_A::fಓ', 67*898184e3Ssthen '... method fಓ resolved itself as expected'); 68