p_chinのおっぱいブログ

UnityとPerlなど

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とか書いたの,例文として分かりづらかったので反省した。