Hatena::Groupsubtech

NaN days

ブログを移転しています。最新の記事は motemen.hatenablog.com へどうぞ

2012-04-26

Class::Accessor::Lite で作れるアクセサに加えて lazy_build 的なものも作れる Class::Accessor::Lite::Lazy

| 21:02 | Class::Accessor::Lite で作れるアクセサに加えて lazy_build 的なものも作れる Class::Accessor::Lite::Lazy - NaN days を含むブックマーク はてなブックマーク - Class::Accessor::Lite で作れるアクセサに加えて lazy_build 的なものも作れる Class::Accessor::Lite::Lazy - NaN days

2012-05-02: shipit いたしました

Perl でクラスを作りたくなったら最近はとりあえず Class::Accessor::Lite を使うことが多いけどよく Moose で言うところの lazy_build (builder) 的なことがしたくなって、いちいち手で書くのもの面倒だし、かといって Mouse に乗り換えよう、という気分にもなれないときのために Class::Accessor::Lite の流儀で lazy accessor を作れるモジュールを書きました。

GitHub - motemen/Class-Accessor-Lite-Lazy: Class: :Lite with lazy accessor feature

package MyPackage;

use Class::Accessor::Lite::Lazy (
    rw_lazy => [ qw(foo) ],
    ro_lazy => [ qw(bar) ],
    # Class::Accessor::Lite functionality is also available
    new => 1,
    rw  => [ qw(baz) ],
);

sub _build_foo {
    my $self = shift;
    warn '_build_foo';
    return -1;
}

sub _build_bar {
    my $self = shift;
    warn '_build_bar';
    return -1;
}

my $o = MyPackage->new(bar => 100);
# _build_foo at ...
say $o->foo; # => -1
say $o->bar; # => 100
say $o->foo; # => -1
say $o->bar; # => 100

SYNOPSIS にある通り、Class::Accessor::Lite のオプションに rw_lazy と ro_lazy が追加されています。これらによって作成されたアクセサに値が設定されていなかった場合、最初の一度だけそのアクセサに対応するビルダーが呼ばれて値が生成されます。今のところ、ビルダーの名前には Moose のデフォルトの名前づけに従って "_build_$attr" という名前を期待するようになっています。