今更ながら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すればいいよ