$obj->SUPER::method(@_)しないで、それでも親クラスのメソッドを呼ぶ

| コメント(0) | トラックバック(0)



今までPerlに置けるオブジェクト指向で親クラスのメソッドを呼ぶ時は



sub method
{
my $self = shift;
$self->SUPER::method(@_);
}

とやれば、$selfは親クラスの@_の正しい位置に置かれるのだがこれをPOEのobject_statesでやろうとするとPOEは特殊な引数の渡し方をしているのでうまくいかない。



sub method
{
my($obj) = @_[OBJECT];
$obj->SUPER::method(@_); # $_[0]に$objが入ってしまって、色々狂う
}

一瞬迷ったんだけど、そういえばcan()というものがあったのを思いだした。普通can()はオブジェクトがあるメソッドを実装してるかどうかテストする時に使うが、実は戻り値にcoderefが返ってくる。じゃあ、これをそのまま実行すればいいじゃん!ってことで以下のようにしてみたら万事OK:



sub method
{
my($obj) = @_[OBJECT];
my $method = $obj->can('SUPER::method');
$method->(@_);
}

おー、いぇ~す。


Author

Daisuke Maki (a.k.a lestrrat): Perl hacker, Director of Japan Perl Association, YAPC::Asia Tokyo Organizer (2009-2012), Fluent in Japanese, English. Ex-Brazilian (sorta)

#perl #c #ruby #java #mysql #english #japanese #opensource #stf #cooking #scotch #cigar


このエントリーをはてなブックマ
ークに追加

翔泳社よりモダンPerl入門(2010)を出版させていただいております。できれば内容をアップデートしたいので是非皆様・・・現在の在庫処理にお力をお貸しください!><

月別アーカイブ