Perl5のキモいコードと一般的な Perl Mongers の関わり方について
書いた人がやりすぎ+あんまりうまくない、が正解なんじやないかなあ RT @toritori0318: 並べて見るとやっぱperlキモイ / メソッドのフック どう書く?org http://htn.to/aGv4tN http://twitter.com/lestrrat/status/22074833828
というのをみたが、たとえば Data::Util をつかえば、こういうかんじで書ける。Data::Util はエンドユーザーがつかわない低レベルライブラリなのでちょっとつかいづらいが、元のコードよりはだいぶマシといえるだろう。
use 5.10.1; use strict; use Data::Util; sub add_hook { my ($class, $method, $type, $code) = @_; no strict 'refs'; *{"${class}::${method}"} = Data::Util::modify_subroutine(*{"${class}::${method}"}{CODE}, $type => [$code]); } { package MyApp; sub foo { say "BODY"; } } add_hook('MyApp' => 'foo', before => sub { say "BEFORE" }); add_hook('MyApp' => 'foo', after => sub { say "AFTER" }); MyApp->foo;
あるいは Moose つかってれば、以下のように書ける。
use 5.10.1; use strict; { package MyApp; use Moose; sub foo { say "BODY"; } } MyApp->meta->add_before_method_modifier( foo => sub { say "BEFORE" } ); MyApp->meta->add_after_method_modifier( foo => sub { say "AFTER" } ); MyApp->foo;
lieutarさんのコードはただしい Pure Perl で書かれたコードなのだが、こういうかんじのコードは一般的な Perl Mongers は知る必要がないように、ライブラリによってラップされているので、案ずることはないのだ。