hasで定義したメソッドのオーバーライドについて

defaultだけ上書きとかできないのかな?

package Foo;
use Moose;
has foo => (
    is => 'rw',
    lazy => 1,
    default => sub { 100 }
);

package Bar;
use Moose;
extends qw(Foo);

# isとlazyを引き継いで欲しい!
has foo => (
    default => sub { 200 }
);

派生先でdefaultだけ上書きしたいんだけどそーゆーのはできない?

やっばhasの定義をBarに全コピーするのがいいのかなぁ。でも定義が重複するのがやだな・・・。triggerとかが二重化しちゃうし。

んー他にはこうするとか?

package Foo;
use Moose;
has foo => (
    is => 'rw',
    lazy => 1,
    default => sub { shift->foo_default }
);
sub foo_default { 100 }

package Bar;
use Moose;
extends qw(Foo);
sub foo_default { 200 }

でもこれだと予めデフォルト値が上書きされる用途だということを想定してないとダメだしなぁ。

あとはもうClass::MOPごり押しで


package Foo;
use Moose;
has foo => (
    is => 'rw',
    lazy => 1,
    default => sub { 100 }
);

package Bar;
use Moose;
extends qw(Foo);
__PACKAGE__->meta->add_attribute(Foo->meta->get_attribute('foo')->clone);
__PACKAGE__->meta->get_attribute('foo')->{'$!default'} = sub { 3000 };

とかでも一応いけたけどさw(バグあるかもしんないけど)

これはさすがにひどいか><

ふ〜む。どうするのがベストなのか今だ迷い中。


追記

コメント欄にてid:dannさんから情報頂きました

has '+foo' => ( default => sub {200} );

いけた!

たぶん公式のやり方あるかもなーとか思いつつも本当にあった!

しかもシンプルでわかりやすい。

id:dannさんありがとうございました。