インスタンスから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