Page Top


NAME

Moose - Perl5のためのまったく現代的なオブジェクトシステム

Page Top


SYNOPSIS

  package Point;
  use strict;
  use warnings;
  use Moose;
  
  has 'x' => (is => 'rw', isa => 'Int');
  has 'y' => (is => 'rw', isa => 'Int');
  sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
  }
  
  package Point3D;
  use strict;
  use warnings;
  use Moose;
  extends 'Point';
  has 'z' => (is => 'rw', isa => 'Int');
  after 'clear' => sub {
    my $self = shift;
    $self->z(0);
  };

Page Top


CAVEAT

Mooseは急速に成熟しつつあるモジュールで、すでに多くに人々によって利用されています。 これはテストスイートが日増しに大きくなっているということでもあり、ドキュメントもすぐにこれに続くでしょう。

これは、Mooseがまだ完了しておらず、まだ発展中のものであると考えられているとも言えます。 外側のAPIの多くが安定していますが、内部はまだ変化を被りやすいです(真剣な考えなしにそれをすることはありませんが)。

その他の詳細については、このドキュメントのFUTURE PLANSセクションを参照してください。

Page Top


DESCRIPTION

MooseはPerl 5オブジェクトシステムの拡張です。

別のオブジェクトシステム!?!?

Yes。 私は最近、Perl 5でオブジェクトを構築する新しい方法の爆発があり、その大半がオブジェクトやそういったものの裏返しに基づいていることを承知しています。 Mooseが違う点は、新しいPerl5のオブジェクトシステムではなく、既存のオブジェクトシステムの拡張であるという点です。

Mooseは、Perl 5のメタクラスシステムである、Class::MOPの頂点に構築されます。 このことは、Mooseがより良いPerl 5オブジェクトの構築だけではなく、メタクラスプログラミングのパワーを提供することを意味しています。

これを製品に使えますか?それとも実験段階でしかありませんか?

MooseはPerl 6 メタモデルのためのプロトタイプと実験に基づいたものですが、しかしMooseは実験的なものやプロトタイプではなく、これは本物です。 私は今年の後半にはMooseを生産環境に採用するつもりであり、すべての面で私が今後クラスのデファクトのビルダーとして使うことを意図したものです。

MooseはPerl 5におけるPerl 6に過ぎませんか?

No。 MooseはPerl 6から非常に多くのひらめきを得たものですが、これ自体はPerl 6ではありません。 そうではなく、これはPerl5のOOシステムです。 私は疲れていたか変わりのない古いうんざりさせるようなPerl 5 OOコードを書いていたし、Perl 5 OOに夢中になっていたので、Mooseを構築しました。 そして、Rubyに乗り換える代わりに、Mooseを書きました :)

Page Top


BUILDING CLASSES WITH MOOSE

Mooseはできる限りクラスの構築/定義において、できる限りの多くの利便性を提供する努力をしていますが、もし望むならあなたの方法のままにしておいてください。 Mooseを使ってクラスを構築する際に注意すべき項目がいくつかあります。

Moose::Objectを継承します。

Mooseは、hasを使って定義された(継承したものを含め)すべてのアトリビュートの管理も行います。 そして、Moose::Objectから継承されたnewをあなたが呼び出すものと仮定しており、呼び出されるとすべてのインスタンス・スロットを適切に初期化し、適当な初期値を設定し、何らかの型制約または強制型変換を行います。

Page Top


EXPORTED FUNCTIONS

Mooseはクラスの名前空間にいくつかの関数をエクスポートし、クラスのセットアップに使えるようにします。 これらの関数はすべて、直接現在のクラスに作用します。

meta

現在のクラスのメタクラスへのアクセス方法を提供するメソッドです。

extends (@superclasses)

カレントクラスのスーパークラス(達)を設定します。

use baseの代わりにこのアプローチを取ることが推奨されます。 use baseは実際にはクラスの@ISAへのpushを行いますが、これはextendsが変更するところだからです。 これは、スーパークラスをもたないクラスでも、Moose::Objectを間違いなく継承するようにするための重要な点です。

with (@roles)

これは与えられた@rolesセットをローカルクラスに適用します。 Roleのサポートは現在、まったくの開発段階にあります; その他の詳細については、Moose::Roleを参照してください。

has ($name, %options)

これは$nameで与えられたアトリビュートを現在のクラスに導入します。 %optionsリストはMoose::Meta::Attributeにあります)。

is => 'rw'|'ro'

isrw(read/write用)かro(read only用)を受け取ります。 これらはそれぞれ、アトリビュート名である$nameと同じ名前の、read/writeのアクセサ、またはread-onlyのアクセサを生成しようとします。

この命名されたアクセサで行われる以上のコントロールを必要とする時は、Class::MOP::Attributeから継承されたreaderwriteraccessorオプションを使用することができます。

isa => $type_name

isaオプションは、はこのアトリビュートの実行時の型制約として、Mooseの型制約機構を設定します。 Mooseはクラスの構築時と、各アクセサの内部で、チェックを行います。 $type_name引数は文字列でなければなりません。 この文字列はクラス名か、Mooseの型定義機能を用いた型定義のどちらかです。

coerce => (1|0)

これはアクセサかコンストラクタから渡された値に対して、与えられた型制約によって、強制型変換を試みます。 この作業に使えるように、型を与えておかなければなりませんMoose::Cookbook::Recipe5の使用例を参照してください。

does => $role_name

これは、このアトリビュートに保持された値が、使用すると予想されるロールの名前を受け取ります。

required => (1|0)

これは、このアトリビュートを必須のものとして指定します。 これは、クラスの構築時に値が与えられなければならなず、アクセサを介してこのアトリビュートにundefをセットすることもできないことを意味しています。

weak_ref => (1|0)

これは、このアトリビュートの値を弱い参照として保持するように、クラスに通知します。 アトリビュートが弱い参照であると、強制型変換(coerce)はできなくなります。

lazy => (1|0)

これは、このスロットが絶対に必要になるまでは、作る必要がないことを、クラスに通知します。 lazyに指定されたアトリビュートは、デフォルトが与えられていなければなりません

auto_deref => (1|0)

これは、返される値を自動的にデリファレンスするか否かを、アクセサに通知します。 これは、isaオプションがArrayRefHashRefのどちらかである時のみ有効です。

trigger => $code

triggerオプションは、アトリビュートに値がセットされた後で呼ばれるCODEのリファレンスです。 CODEリファレンスはインスタンス自身、更新された値とアトリビュートのメタオブジェクト(これはより高度ないじり方のためもので、ほとんどの場合は無視されます)を渡されます。 read-onlyのアトリビュートに対してtriggerを設けることはできません

handles => [ @handles ]

handlesオプションを使用する属性委譲の実験的なサポートがあります。 この他のドキュメントは後日になります。

before $name|@names => sub { ... }
after $name|@names => sub { ... }
around $name|@names => sub { ... }

この3つの項目は、Class::MOPの提供するbefore、after、aroundメソッドの変更機能の、シンタックス・シュガーです。 その他の情報については、今のところ、Class::MOPのドキュメントで見つけることができます。

super

キーワードsuperは、overrideメソッドの外側で呼ばれた場合、no-op(無操作命令)です。 overrideメソッドのコンテクストでは、オリジナルのメソッドと同様の引数で、次のもっとも適切なスーパークラスのメソッドを呼びます。

override ($name, &sub)

overrideメソッドは、「私はスーパークラスのこのメソッドを上書き(オーバーライド)しています」と明示的に宣言するためのメソッドです。 このメソッド中ではsuperを呼ぶことができ、これは期待通りに動作します。 同じように、canは通常のメソッド呼び出しとしてもとしてSUPER::プシュードパッケージでも完了できます。 これはまったく、あなたの選択次第です。

inner

innerキーワードは、superに非常に似ており、augmentメソッドのコンテクストの外では、no-opです。 innersuperの逆にしたものだと考えることもできます; Moose::Cookbookに最良の記述があります。

augment ($name, &sub)

augmentメソッドは、「私はスーパークラスにこのメソッドを追加しています」と明示的に通知する方法です。 繰り返しになりますが、Moose::Cookbookに最良の記述があります。

confess

これはCarp::confessの機能ですが、私が毎回使うものだったので、ここにエクスポートされています。 この機能は将来変更されるかも知れませんので、あらかじめ警告しておきます。

blessed

これはScalar::Uti::blessedの機能ですが、私が毎回使うものだったので、ここにエクスポートされています。 どこでオブジェクトのクラス名のテストをする時でも、refの代わりに使うことを強く推奨します。

Page Top


UNEXPORTING FUNCTIONS

unimport

Mooseはunimportメソッドを通じて、これがエクスポートするキーワードを削除する方法を提供します。 これを動作させるには、あなたのコードの末尾でno Mooseとだけ通知する必要があります。例を挙げます:

    package Person;
    use Moose;
    has 'first_name' => (is => 'rw', isa => 'Str');
    has 'last_name'  => (is => 'rw', isa => 'Str');
        sub full_name {
        my $self = shift;
        $self->first_name . ' ' . $self->last_name
    }
        no Moose; # Personパッケージからキーワードが削除される

Page Top


MISC.

What does Moose stand for??

Mooseは何か特定のことのためのものではありませんが、あなたが望むなら、私の気に入っているものを挙げておきます; 追加はお気軽にお寄せください :)

他のオブジェクトシステムが羨むように
オブジェクト指向をこんなに簡単に
Spiffy屋をオブジェクト指向に(ごめんね、ingy)
他の大半のオブジェクトシステムを骨抜きに
Mooseはときに早々に生み出される
Mooseはときに最高の拡張性を提供
メタオブジェクト指向の記法拡張

Page Top


CAVEATS

Page Top


ACKNOWLEDGEMENTS

私をメタモデルの狂気に導いたSam Vilainを呪います。
私に#perl6でメタモデル癖を勧めてくれたAudrey Tangを呪います。
Yuval ``nothingmuch'' Kogman抜きではこのモジュールはありえなかったでしょう、そしてこんな名前にもならなかったでしょう ;P
型制約モジュールの基礎は元々はRob Kinyonのアイディアであり、私はこれを転がしただけです。
mst & chansenと全ての#moose pooseからのアイディア/機能要求/推奨に感謝します。
David ``Theory'' Wheelerのメタディスカッションと綴り間違いの訂正に感謝します。

Page Top


SEE ALSO

Class::MOPドキュメント
irc.perl.orgの#mooseチャンネル
http://forum2.org/moose/
http://www.cs.utah.edu/plt/publications/oopsla04-gff.pdf

このペーパー(lbrから#mooseで勧められました)がsuper/overrrideinner/augmentの機能の実装に導きました。これらの機能を本当に理解したければ、私からもこれを読むように勧めます。

Page Top


BUGS

複雑なソフトウェアにはバグが潜むものであり、このモジュールも例外ではありません。 もしバグを見つけたら、私にemailするか、あるいはcpan-RTにバグを追加してください。

Page Top


AUTHOR

Stevan Little <stevan@iinteractive.com>

Christian Hansen <chansen@cpan.org>

Yuval Kogman <nothingmuch@woobling.org>

Page Top


COPYRIGHT AND LICENSE

Copyright 2006 by Infinity Interactive, Inc.

http://www.iinteractive.com

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

Page Top


DOCUMENT TRANSLATION

Makio Tsukamoto, tsukamoto@gmail.com

Page Top