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(バグあるかもしんないけど)
これはさすがにひどいか><
ふ〜む。どうするのがベストなのか今だ迷い中。