2011年10月24日月曜日

Moose アトリビュート


このエントリーをはてなブックマークに追加


和訳マニュアル アトリビュート


アトリビュート(属性)



has 'weight' => (
is => 'ro',
writer => '_set_weight',
default =>
sub { ( 'small', 'medium', 'large' )[ int( rand 3 ) ] },
required => 1,
clearer => 'clear_weigth',
predicate => 'has_weight',
);



  • is

    • ro,rwの指定



  • isa

    • クラス指定

    • Int,Str,単純にObjectってあるのは何だろ



  • writer

    • 属性名とは異なる名前で書き込みメソッドを呼び出す

    • 外部からは読み取り専用だが、内部では書き込みしたい場合に使用。



  • predicate

    • 値がセットされていれば真を返す

    • undefが明示的に代入されている場合も真。



  • clearer

    • 値をセットされていない状態にする

    • undefとは異なり、predicateで偽になる。



  • required

    • 属性を必ずコンストラクタに渡す。

    • 値が必須なわけではないので、undefかも。



  • default

    • 単純なスカラ

    • サブルーチンリファレンス => 代わりにbuilderメソッドが推奨

      • サブルーチン以外のリファレンスを渡すとエラー。





  • builder

    • _build_属性名 がメソッド名になる。

    • 継承もオーバーライドも可能

    • roleの属性でbuilderのメソッド名を指定しておいて、roleを使用するクラスで、その名前のメソッドを定義することもできる。





package HasSize;
use Moose::Role;
requires '_build_size'; # Roleを使用するクラスに必要なメソッド

has 'size' => (
is => 'ro',
lazy => 1,
builder => '_build_size',
);

package Lilliputian;
use Moose;

with 'HasSize';

sub _build_size { return 'small' }



  • lazy

    • defaultが単純なスカラーでない場合と、builderの場合は必ず使用。

      • default値が他のobjectと依存関係の場合があるから

      • cpu処理を減らす





  • lazy_build

    • 複数オプションをまとめて設定





has 'size' => (
is => 'ro',
lazy_build => 1,
);

has 'size' => (
is => 'ro',
lazy => 1,
builder => '_build_size',
clearer => 'clear_size',
predicate => 'has_size',
);




  • init_arg

    • クラスのコンストラクタで使用する名前を属性名とは別のものにする。以下は属性名はbignessだが、コンストラクタではsizeで属性値を設定する。

    • init_arg => undefにした場合はコンストラクタで初期値を設定することはできない。プライベートな属性に便利。






has 'bigness' => (
is => 'ro',
init_arg => 'size',
);




  • weak_ref

    • 属性に値がセットされたときは常にScalar::Util::weakenを呼ぶ

    • 循環参照になるかもしれないオブジェクトを作るとき便利



  • trigger

    • 属性が更新された「後に」呼び出すメソッド

    • trigger発動の条件

      • 属性が更新された場合(類似のafterメソッドモディファイアは読み込みでも呼ばれる)

      • 属性の値がコンストラクタに渡されたとき



    • triggerが呼ばれない条件

      • defaultやbuilderで値がセットされた場合



    • 更新前の値と更新後の値が引数にとれる。

    • 初めて設定される場合は引数の数がひとつ少ないので識別できる。



  • handles(委譲)

    • handles => { hair_color_hex => 'as_hex_string' }

    • hair_color_hexを呼ぶと、as_hex_stringが呼ばれるだけ?



  • トレート?

    • Roleのこと

    • 複数指定できるのが利点

    • ネイティブトレート

      • Hash(Moose::Meta::Attribute::Native::Trait::Hash)

      • Number (Moose::Meta::Attribute::Native::Trait::Number)

      • Counter (Moose::Meta::Attribute::Native::Trait::Counter)

      • String (Moose::Meta::Attribute::Native::Trait::String)

      • Bool (Moose::Meta::Attribute::Native::Trait::Bool)

      • Array (Moose::Meta::Attribute::Native::Trait::Array)





  • オーバーライド

    • 子クラスで属性名の前に+を付けるだけ



  • 複数属性の定義

    • has [ 'x', 'y' ] => ( is => 'ro', isa => 'Int' );







0 件のコメント:

コメントを投稿