今更ながらClass:C3
いつの話題だよって感じだけど。
フィーリングでしか使ってなかったので、ちゃんと勉強。
ヽ( ・∀・)ノ
勉強終了。
教材:(Ab)?using Class::C3 - YAPC::Asia 2007 Tokyo Sessions
インターネット万歳。
@ISAを変更
動画で触れてた動的@ISAの変更。
package Pa1; use Class::C3; use Perl6::Say; sub hello {say 'Pa1 hello'} package Pa2; use base 'Pa1'; use Class::C3; use Perl6::Say; sub hello {say 'Pa2 hello';shift->next::method;} package Pa3; use base 'Pa1'; use Class::C3; use Perl6::Say; sub hello {say 'Pa3 hello';shift->next::method;} package Pa4; use base qw/Pa2 Pa3/; use Class::C3; use Perl6::Say; use Data::Dumper; our @ISA; sub hello {say 'Pa4 hello';shift->next::method;} sub p {warn Dumper shift} sub dump_isa { p \@ISA; } sub shift_isa {shift @ISA} package main; use strict; use warnings; use Perl6::Say; Class::C3::initialize(); Pa4->hello(); Pa4->dump_isa(); Pa4->shift_isa(); Pa4->dump_isa(); say 'after shift'; Pa4->hello(); Class::C3::initialize(); # == reinitialize say 'after re-initialize'; Pa4->hello();
ポイント
- やるなって言ってるのはCAVEATSのChanging @ISA.
- 「@ISAを変更するのは気が狂ってる」
- 変えたら何が起こるかっつーと、無くなってるはずなのに呼べるだけ
- ドキュメントにある通り、reinitializeはinitializeのエイリアス
sub reinitialize { goto &initialize }
- @ISA変えたらreinitializeすればいいよ