読者です 読者をやめる 読者になる 読者になる

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