今まで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->(@_);
}
おー、いぇ~す。