Mooseかじりかけ
http://search.cpan.org/~stevan/Moose-0.40/lib/Moose.pm
何かと話題のMooseかじりかけです。そもそも何?から入ってみました。自分用。
A postmodern object system for Perl 5
という事でperl5OOを今風に書けるよ!って事でしょうかね。
とりあえず書いた
例によって武藤敬治クラス。継承(extends)とかは今回手を出してません。
package Muto; use Moose; use DateTime; has 'height' => (is => 'ro', isa => 'Int', default => 188); has 'weight' => (is => 'ro', isa => 'Int', default => 115); has 'birthday' => ( is => 'ro', isa => 'Object', default => sub { DateTime->new(year => 1962, month => 12, day => 23) }, ); has 'finish_hold' => ( is => 'rw', isa => 'ArrayRef', # ArrayRefはsubでラップしろと怒られた. default => sub { [ 'Moonsault press', 'Shining wizard', ] }, auto_deref => '1', ); has 'wikipedia_url' => ( is => 'rw', isa => 'Str', default => 'http://ja.wikipedia.org/wiki/%E6%AD%A6%E8%97%A4%E6%95%AC%E5%8F%B8', ); 1;
とりあえずこんな感じでクラスを作るみたい。
Class::Accessor+Class::Structをより柔軟にした感じという印象。(今のところ)
hasでキモはis,isa,defaultといったところでしょうか。
is | 読み書き属性 | rw=両方,ro=読みのみ |
isa | データ型属性 | http://search.cpan.org/~stevan/Moose-0.40/lib/Moose/Util/TypeConstraints.pm#Default_Type_Constraints |
default | デフォルト値 |
ってとこかなぁ。auto_derefはアクセスした時勝手にデリファレンスしてくれる。
とりあえず動かしてみた
use strict; use warnings; use Data::Dumper; sub in_eval(&) { my $code = shift; eval { $code->() }; if ($@) { warn $@; } } my $muto = Muto->new(); # 怒られる. in_eval { $muto->height(190) }; warn $muto->birthday->year(); # auto_deref周り # push $muto->finish_hold, "Figure-four leg lock" }; # だとコンパイルエラー # pushとかはこれでいける. push @{$muto->finish_hold}, "Figure-four leg lock"; # 確かにデリファレンスしないで使える。 print $_ for $muto->finish_hold; # これもデリファレンスしてくれる. warn Dumper [$muto->finish_hold];
で↓が結果。
Cannot assign a value to a read-only accessor at (eval 839) line 1 Muto::height('Muto=HASH(0x8cb0e00)', 190) called at moose.pl line 45 main::__ANON__() called at moose.pl line 37 eval {...} called at moose.pl line 37 main::in_eval('CODE(0x8689660)') called at moose.pl line 45 1962 at moose.pl line 47. Moonsault press Shining wizard Figure-four leg lock $VAR1 = [ 'Moonsault press', 'Shining wizard', 'Figure-four leg lock' ]; # No tests run!
エラーの時はstackを勝手に出してれるのか。
その他は期待通りの動き。
気づいた事
確かにコード量が減りそう。似たようなロジックも減りそう。
多分オブジェクト間の連携で真価を発揮しそうな希ガス。
という訳で今回はアプローチを間違えたっぽ。闘魂三銃士にすればよかった。
autobox+Mooseで何人たりとも入れない樹海を築けそう。
という訳でアプローチを変えてもちっと掘り下げてみよう。