Mouseを少し使ってみた
初めてMouseを使ったクラス作ったりしたので、その覚え書き
多分ドキュメント読めばOKな内容だ。
使用例
package Fugu::Base; use Mouse; #Mouseのコード書くぞ(><) has life => ( is => 'rw', #get,setを許可 isa => 'Int', #Validateもしてくれる required => 1 #0, 1のbool値でnewする時に値を入れるのが必須か設定 ); has fugu => ( is => 'ro', #readonly isa => 'Fugu', lazy => 1 #boolでdefaultの中身を実行するタイミングを変える default => sub { return Fugu->new; } ); no Mouse; # ここから下はMouseの文法じゃなくていいよ sub name { 'フグ男'; }
継承も、もちろん出来る
package Fugu::Big; use Mouse; extends Fugu::Base; # 上のコードを継承してるよ(parentじゃダメらしい has scale => ( is => 'rw', isa => 'Int', required => 1 ) no Mouse;
new してみる
# required => 1のプロパティは値を入れないとエラー出るよ my $big_fugu = Fugu::Big->new( life => 10, scale => 180 ) # もちろん普通のsubも呼べるよ my $big_fugu_name = $big_fugu->name; # フグ男
解説
- newした時に、hasで定義したプロパティに値を入れられる(use Mouse;すると、newが勝手に生える)
- required => 1したら必ずnewした時に値を入れなければいけない
- lazyは遅延評価の意味なので、実際にgetされた時に始めてdefault内の処理が走る(lazyしないと、newされた時にdefault内が実行されてしまう)
- hasでプロパティにしていると、値が保存されるので、使い回したい時は便利
- use Mouseしてるクラスを継承する時は、継承先でもuse Mouseして、extends '親クラスの名前'を宣言する必要が有る
- isaのvalidateは、newやis => 'rw'などで外部から値を入れられる可能性があると、指定して欲しい
MouseのBUILD
- use Mouseされたクラスにはnewが生える。
- そのnewの中でBUILDを呼んでるので、newの後に処理を加えたかったらBUILDに処理を書く
まとめ
Fugu::BaseのプロパティにFugu->newとか書いたの,例文として分かりづらかったので反省した。