tokuhirom's Blog

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