モダンPerlの世界へようこそ

第4回 Any::Moose:なにがどうでもムースはムース

この記事を読むのに必要な時間:およそ 5 分

Any::Moose

ただし,Mooseの世界におけるMouseの位置づけは,あくまでもライトユーザ向けの代替品にすぎません。Mooseがロードされている環境ではメモリの無駄遣いになるので使うべきではないとされていますし,今後,Mooseがさらに成長して高速化が進むようなら,開発リソースの無駄遣いということでMouse不要論が出てこないとも限りません。

そのため,過渡期のいまは,Mooseに対する配慮として,Mouseを直接使うのではなくAny::Mooseというラッパを一枚挟んでおくことが奨励されています。

このAny::Mooseは,趣旨としてはSquirrelと同等のものですが,Mouseが高機能化して,単純なMoose/Mouseの振り分けでは対応しきれなくなったため,あらためて両者の橋渡しをするために用意されたもの。

Moose/Mouse本体だけでなく,ロールや,MooseX以下の拡張モジュールなどの振り分けにも対応しているのが特徴で,たとえば前回利用したBatクラスであれば,このように書き直せます※3⁠。

use strict;
use warnings;
use Test::More tests => 4;

package Fly;
use Any::Moose '::Role'; requires 'fly_with';
sub fly {
    my $self = shift;
    print "I can fly with ".$self->fly_with.".\n";
}

package Mammal;
use Any::Moose;
sub produce_milk { print "I can produce milk.\n"; }

package Bat;
use Any::Moose; extends 'Mammal'; with 'Fly';
sub fly_with { 'wings'; }

package main;

my $bat = Bat->new;

can_ok($bat => 'produce_milk'); # ok
can_ok($bat => 'fly');          # ok
ok($bat->isa('Mammal'));        # ok
ok(!$bat->isa('Bird'));         # ok
※3

なお,通常はこのようにuse Mouse;ないしuse Moose;の行をuse Any::Moose;に書き換え,ロールなどの場合は,use Mouse::Role;のようになっているところをuse Any::Moose '::Role';のように書き換えればすむのですが,ごくたまに,Mouse側が未対応だったり,MooseとMouseで微妙にAPIが異なっていたりするために,両方で通用する書き方に直す手間が発生することがあります。Mouseのコミッタには日本人も混じっていますので,必要な方はぜひパッチをお送りください。

必要な部分のみ使えばよいのです

MooseはよくPerl 5のオブジェクト機構に対する革命であるといわれます。実際,その気になって使えば,メソッドと単なる関数を区別したり,アトリビュートに型制約をつけたり,ここでは説明しませんでしたが,第2回で見たやり方とはひと味異なる柔軟なメソッドの修飾を行ったりと,実にこだわった書き方ができるようになるのですが,Mooseは,誕生前夜に一世を風靡していた(ダミアン・コンウェイ氏のPerlベストプラクティスなどで紹介されている)インサイドアウト式のアトリビュートなどは採用していません。あくまでもごくふつうのPerl 5オブジェクトのなかに,必要な部分のみ組み込んで使えるようにつくられています。

今回紹介した初期のMouseのように,hasとextendsだけ利用するのもよいでしょうし,前回紹介したようにロールにこだわって使うのもよいでしょう。

Mooseも,別の特集記事で紹介したMojoと並んで,いま,Perl Foundationの助成金でドキュメントの拡充をはかっています※4⁠。その一部はすでにMoose本体のディストリビューションに収録されて公開されていますが,予定では今後まだまだドキュメントが増えることになっていますので,これまで敬遠していた方も,これを機会にぜひ一度Moose/Mouseの世界に触れてみていただければと思います。

※4

http://www.perlfoundation.org/dave_rolsky_moose_docs

著者プロフィール

石垣憲一(いしがきけんいち)

あるときは翻訳家。あるときはPerlプログラマ。先日『カクテルホントのうんちく話』(柴田書店)を上梓。最新刊は『ガリア戦記』(平凡社ライブラリー)。

URLhttp://d.hatena.ne.jp/charsbar/