lazyなdefault再呼び出し

metaクラスからたどって直接呼び出した方がわかりやすいんではないかと思ったりしました。

package Foo;
use Moose;

has hoge  => (
    is    => 'rw',
    lazy  => 1,
    default => sub { 100 },
);

__PACKAGE__->meta->make_immutable;

1;

package main;
use strict;
use warnings;

my $foo = Foo->new;

print $foo->hoge . "\n"; #=> 100

$foo->hoge(200);

print $foo->hoge . "\n"; #=> 200

$foo->hoge($foo->meta->get_attribute_map->{hoge}->default->());

print $foo->hoge . "\n"; #=> 100
インスタンスからdefaultを呼ぶ - walf443's blog

なるほど。defaultを自分で呼び出しするというわけですか。

これはこれで有りかもだけど、今回の僕の用途としてはhogeが再度呼び出された段階で、つまりlazyにdefault格納されて欲しかったのでちょっと違うかな。

あと上記の場合だとtrigger設定されてるときはtrigger動いちゃうしね。まーそれはメソッド経由せずに$foo->{hoge}に直接格納すれば良いだけの話だけども。

まー実装中にmetaクラス意識しちゃうコードはあんまり書きたくないってのが本音なので個人的にはdelete $foo->{hoge}がスマートだとは思う。

ちなみにmetaクラスは奥が深いというか、defaultを直接呼ぶのなら

$foo->{hoge} = $foo->meta->get_attribute('hoge')->default($foo);

get_attributeを使った方が直感的かなーとは思った。まぁどっちでもいいっちゃいいんだけど。


とゆーかclassxってそんなのあったんだ!と、思ったら作者様だったのですね><

面白そうなのでちょっとコードレビューしようかな。Rubyの勉強中(ほんまかいな)だし。