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 は知る必要がないように、ライブラリによってラップされているので、案ずることはないのだ。
Published: 2010-08-08(Wed) 11:43