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で何人たりとも入れない樹海を築けそう。



という訳でアプローチを変えてもちっと掘り下げてみよう。