継承ツリーに嵌った。 Class::C3とかNEXTとか
use baseを使わずに、@ISAを触るようにすると解消されました。
ただ、なんでuse baseを使うと@ISAにExporterが入ってくるのがわかりません。
#! perl package Z; use Class::C3; use base (); sub foo{ print "Z\n"; } package A; use Class::C3; use base qw/Z/; sub foo{ print "A:@A::ISA\n"; $_[0]->next::method() } package B; use Class::C3; use base qw/A/; sub foo{ print "B:@B::ISA\n"; $_[0]->next::method() } package C; use Class::C3; use base qw/B/; sub foo{ print "C:@C::ISA\n"; $_[0]->next::method() } package D; use Class::C3; use base qw/B/; sub foo{ print "D:@D::ISA\n"; $_[0]->next::method() } package E; use Class::C3; use base qw/B/; sub foo{ print "E:@E::ISA\n"; $_[0]->next::method() } package F; use Class::C3; use base qw/C D E/; sub foo{ print "F:@F::ISA\n"; $_[0]->next::method() } package main; use strict; use warnings; use Class::C3; F->foo();
$ c3.pl F:C D E C:B D:B E:B B:Exporter No next::method 'foo' found for F at /usr/lib/perl5/5.10.0/mro.pm line 26.
ん〜〜。 なんで@B::ISA = (Exporter)になっているのかが、全くわかりません。。。
F->C->D->E->B->A->Zと順番に呼び出される予定なんですが。