インスタンスからdefaultを呼ぶ
http://d.hatena.ne.jp/fbis/20080918/1221717538
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
classXでも似たようなことができるので当然Mooseもできるのだろうなと探してみたというおはなしでした。
require 'classx' class Foo has :hoge, :writable => true, :default => 100 end foo = Foo.new foo.hoge #=> 100 foo.hoge = 200 foo.hoge #=> 200 foo.hoge = foo.attribute_of['hoge'].class.default(foo) foo.hoge #=> 100