Class::Method::Modifiers::Fastのバグ
Class::Method::Modifiers::FastのバグはてっきりRoleが継承ではなくサブルーチンのコピーで機能の拡張をしていることが原因だと思ったのだが,よく検討してみるとMouseのバグのような気がしてきた。
以下のようにすると問題は起きない*1。
Index: lib/Mouse/Meta/Role.pm =================================================================== --- lib/Mouse/Meta/Role.pm (revision 7618) +++ lib/Mouse/Meta/Role.pm (working copy) @@ -91,12 +91,12 @@ # XXX what's Moose's behavior? #next; } else { - *{"${classname}::${name}"} = *{"${selfname}::${name}"}; + *{"${classname}::${name}"} = \&{"${selfname}::${name}"}; } if ($args{alias} && $args{alias}->{$name}) { my $dstname = $args{alias}->{$name}; unless ($classname->can($dstname)) { - *{"${classname}::${dstname}"} = *{"${selfname}::${name}"}; + *{"${classname}::${dstname}"} = \&{"${selfname}::${name}"}; } } }
一般的に言って,型グロブのコピーは何が起きるか非常に分かりにくい。だから,どうしても必要なとき以外は避けるべきだと思う。この場合はコードリファレンスで十分だ。
*1:このパッチはRTで報告済み。