1

他のクラス属性に基づいて設定したい属性特性があります。$self属性のメタではなく、クラスのコピーを取得する属性特性のデフォルトが本当に必要です。クラスで次のようなことをしたい:

after 'BUILD' => sub {                                                     
  my $self = shift;                                                        
  $self->meta->get_attribute('id')->column_name( $self->_unique_key_name );
};  

でも、自分の属性特性ROを維持したいのですが?これは可能ですか?MOP でクラス属性の値を設定できることは知っていますが、メタ属性に属性を設定する方法がわかりません。

4

1 に答える 1

1

これは非常に奇妙な設計のように思えます (なぜメタクラスはそれが記述しているクラスのインスタンスを必要とするのでしょうか?) -- しかし、メタクラスのメタクラスを使用することでこれを十分に簡単に行うことができます (Moose メタクラスは MOP を使用してブートストラップされることを思い出してください)。自体):

$self->meta->meta->get_attribute("foo")->default($some_value);

また、デフォルトが参照自体である場合、デフォルトをコードリファレンスでラップする必要があることに注意してください。$some_value = sub { $instance };


実際には、これは機能しません。「デフォルト」は読み取り専用です。このような低レベルで MOP をいじるのではなく、設計を再考することをお勧めします。たとえば、「デフォルト」を別の属性に保存し、それに委任するデフォルトのサブを作成します。

package MyApp::Meta::Attribute::Trait::Foo;

# set at runtime, when we have an instance to store here
has _default_of_foo => (
    is => 'rw', isa => 'Object',
);
has foo => (
    is => 'ro', isa => 'Object',
    lazy => 1,
    default => sub { shift->_default_of_foo },
);
于 2010-11-16T16:55:21.507 に答える