tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

これをもっときれいに書く方法ないかなぁ。。。

Test::Module::Usedを書いている際に思ったことメモ。

Perlオブジェクト指向で書いる場合で、subref を受けるメソッドで、受けた subref もそのクラスのメソッドの場合に、うまく $self を渡す方法がないのかなぁ、と思いました。

分かりにくいので、実際のコードで説明します。
呼び出し側(subref を渡す側)はこんな感じ。

$self->_ok(\&_num_tests_used_ok, \&_used_ok);

_num_tests_used_ok も _used_ok もこのクラス(Test::Module::Used)のメソッドです。

で、呼び出され側(subref を使う側)はこんな感じ。

sub _ok {
    my $self = shift;
    my ($num_tests_subref, @ok_subrefs) = @_;
    #...
    my $num_tests = $num_tests_subref->($self);
    #...
}

この、

$num_tests_subref->($self);

が何とかならんのかなぁ、と思うのです。$self は前に来てほしいですよね、普通に。

普通のアプリケーションであれば、クラスを分割して、Strategy パターンとか使うのが正しい、ということで問題ないのですが、コレは CPAN モジュールなので、別ファイルはあまり良くないな、と思うのです。ユーザが直接使わないクラスを CPAN にアップするのは良くないし、将来のリファクタリングでクラスが不要になったりしたら悲惨だし。

黒魔術なし(no warnings でも嫌)で、うまく書く方法ないかなぁ。。。