=encoding utf8 =head1 NAME Moose - Perl5のためのまったく現代的なオブジェクトシステム =head1 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); }; =head1 CAVEAT Mooseは急速に成熟しつつあるモジュールで、すでに多くに人々によって利用されています。 これはテストスイートが日増しに大きくなっているということでもあり、ドキュメントもすぐにこれに続くでしょう。 これは、Mooseがまだ完了しておらず、まだ発展中のものであると考えられているとも言えます。 外側のAPIの多くが安定していますが、内部はまだ変化を被りやすいです(真剣な考えなしにそれをすることはありませんが)。 その他の詳細については、このドキュメントのLセクションを参照してください。 =head1 DESCRIPTION MooseはPerl 5オブジェクトシステムの拡張です。 =head2 別のオブジェクトシステム!?!? Yes。 私は最近、Perl 5でオブジェクトを構築する新しい方法の爆発があり、その大半がオブジェクトやそういったものの裏返しに基づいていることを承知しています。 Mooseが違う点は、新しいPerl5のオブジェクトシステムではなく、既存のオブジェクトシステムの拡張であるという点です。 Mooseは、Perl 5のメタクラスシステムである、Lの頂点に構築されます。 このことは、Mooseがより良いPerl 5オブジェクトの構築だけではなく、メタクラスプログラミングのパワーを提供することを意味しています。 =head2 これを製品に使えますか?それとも実験段階でしかありませんか? MooseはPerl 6 メタモデルのためのプロトタイプと実験にI<基づいた>ものですが、しかしMooseは実験的なものやプロトタイプB<ではなく>、これはB<本物>です。 私は今年の後半にはMooseを生産環境に採用するつもりであり、すべての面で私が今後クラスのデファクトのビルダーとして使うことを意図したものです。 =head2 MooseはPerl 5におけるPerl 6に過ぎませんか? No。 MooseはPerl 6から非常に多くのひらめきを得たものですが、これ自体はPerl 6ではありません。 そうではなく、これはPerl5のOOシステムです。 私は疲れていたか変わりのない古いうんざりさせるようなPerl 5 OOコードを書いていたし、Perl 5 OOに夢中になっていたので、Mooseを構築しました。 そして、Rubyに乗り換える代わりに、Mooseを書きました :) =head1 BUILDING CLASSES WITH MOOSE Mooseはできる限りクラスの構築/定義において、できる限りの多くの利便性を提供する努力をしていますが、もし望むならあなたの方法のままにしておいてください。 Mooseを使ってクラスを構築する際に注意すべき項目がいくつかあります。 Cを指定しなかった場合、Mooseを利用するすべてのクラスはLを継承します。 Mooseは、Cを使って定義された(継承したものを含め)すべてのアトリビュートの管理も行います。 そして、Lから継承されたCをあなたが呼び出すものと仮定しており、呼び出されるとすべてのインスタンス・スロットを適切に初期化し、適当な初期値を設定し、何らかの型制約または強制型変換を行います。 =head1 EXPORTED FUNCTIONS Mooseはクラスの名前空間にいくつかの関数をエクスポートし、クラスのセットアップに使えるようにします。 これらの関数はすべて、直接現在のクラスに作用します。 =over 4 =item B 現在のクラスのメタクラスへのアクセス方法を提供するメソッドです。 =item B カレントクラスのスーパークラス(達)を設定します。 Cの代わりにこのアプローチを取ることが推奨されます。 Cは実際にはクラスのC<@ISA>へのCを行いますが、これはCが変更するところだからです。 これは、スーパークラスをもたないクラスでも、Lを間違いなく継承するようにするための重要な点です。 =item B これは与えられたC<@roles>セットをローカルクラスに適用します。 Roleのサポートは現在、まったくの開発段階にあります; その他の詳細については、Lを参照してください。 =item B これはC<$name>で与えられたアトリビュートを現在のクラスに導入します。 C<%options>リストはLで与えられるものと同じものですが、Mooseの提供する以下のリストが追加されます(その他の仕様についてはLにあります)。 =over 4 =item I 'rw'|'ro'> IはI(read/write用)かI(read only用)を受け取ります。 これらはそれぞれ、アトリビュート名であるC<$name>と同じ名前の、read/writeのアクセサ、またはread-onlyのアクセサを生成しようとします。 この命名されたアクセサで行われる以上のコントロールを必要とする時は、Lから継承されたIやI、Iオプションを使用することができます。 =item I $type_name> Iオプションは、はこのアトリビュートの実行時の型制約として、Mooseの型制約機構を設定します。 Mooseはクラスの構築時と、各アクセサの内部で、チェックを行います。 C<$type_name>引数は文字列でなければなりません。 この文字列はクラス名か、Mooseの型定義機能を用いた型定義のどちらかです。 =item I (1|0)> これはアクセサかコンストラクタから渡された値に対して、与えられた型制約によって、強制型変換を試みます。 この作業に使えるように、型を与えてB<おかなければなりません>。 Lの使用例を参照してください。 =item I $role_name> これは、このアトリビュートに保持された値が、使用すると予想されるロールの名前を受け取ります。 =item I (1|0)> これは、このアトリビュートを必須のものとして指定します。 これは、クラスの構築時に値が与えられなければならなず、アクセサを介してこのアトリビュートにCをセットすることもできないことを意味しています。 =item I (1|0)> これは、このアトリビュートの値を弱い参照として保持するように、クラスに通知します。 アトリビュートが弱い参照であると、強制型変換(coerce)はB<できなく>なります。 =item I (1|0)> これは、このスロットが絶対に必要になるまでは、作る必要がないことを、クラスに通知します。 lazyに指定されたアトリビュートは、デフォルトが与えられてB<いなければなりません>。 =item I (1|0)> これは、返される値を自動的にデリファレンスするか否かを、アクセサに通知します。 これは、CオプションがCとCのどちらかである時のみ有効です。 =item I $code> triggerオプションは、アトリビュートに値がセットされた後で呼ばれるCODEのリファレンスです。 CODEリファレンスはインスタンス自身、更新された値とアトリビュートのメタオブジェクト(これはより高度ないじり方のためもので、ほとんどの場合は無視されます)を渡されます。 read-onlyのアトリビュートに対してtriggerを設けることはB<できません>。 =item I [ @handles ]> Cオプションを使用する属性委譲の実験的なサポートがあります。 この他のドキュメントは後日になります。 =back =item B sub { ... }> =item B sub { ... }> =item B sub { ... }> この3つの項目は、Lの提供するbefore、after、aroundメソッドの変更機能の、シンタックス・シュガーです。 その他の情報については、今のところ、Lのドキュメントで見つけることができます。 =item B キーワードCは、Cメソッドの外側で呼ばれた場合、no-op(無操作命令)です。 Cメソッドのコンテクストでは、オリジナルのメソッドと同様の引数で、次のもっとも適切なスーパークラスのメソッドを呼びます。 =item B Cメソッドは、「私はスーパークラスのこのメソッドを上書き(オーバーライド)しています」と明示的に宣言するためのメソッドです。 このメソッド中ではCを呼ぶことができ、これは期待通りに動作します。 同じように、Iは通常のメソッド呼び出しとしてもとしてCプシュードパッケージでも完了できます。 これはまったく、あなたの選択次第です。 =item B Cキーワードは、Cに非常に似ており、Cメソッドのコンテクストの外では、no-opです。 CをCの逆にしたものだと考えることもできます; CとCの動作についての詳細は、Lに最良の記述があります。 =item B Cメソッドは、「私はスーパークラスにこのメソッドを追加しています」と明示的に通知する方法です。 繰り返しになりますが、CとCの動作についての詳細は、Lに最良の記述があります。 =item B これはCの機能ですが、私が毎回使うものだったので、ここにエクスポートされています。 この機能は将来変更されるかも知れませんので、あらかじめ警告しておきます。 =item B これはCの機能ですが、私が毎回使うものだったので、ここにエクスポートされています。 どこでオブジェクトのクラス名のテストをする時でも、Cの代わりに使うことを強く推奨します。 =back =head1 UNEXPORTING FUNCTIONS =head2 B MooseはCメソッドを通じて、これがエクスポートするキーワードを削除する方法を提供します。 これを動作させるには、あなたのコードの末尾でCとだけ通知する必要があります。例を挙げます: 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パッケージからキーワードが削除される =head1 MISC. =head2 What does Moose stand for?? Mooseは何か特定のことのためのものではありませんが、あなたが望むなら、私の気に入っているものを挙げておきます; 追加はお気軽にお寄せください :) =over 4 =item 他のオブジェクトシステムが羨むように =item オブジェクト指向をこんなに簡単に =item Spiffy屋をオブジェクト指向に(ごめんね、ingy) =item 他の大半のオブジェクトシステムを骨抜きに =item Mooseはときに早々に生み出される =item Mooseはときに最高の拡張性を提供 =item メタオブジェクト指向の記法拡張 =back =head1 CAVEATS =over 4 =item * CとC、Cを同じメソッド内で使用できることには注意しておくべきでしょう。 しかしながら、これらは同じクラス階層に結合することができます; 例としてはFを参照。 その理由は、CがCモディファイアを伴うメソッドの中でのみ有効で、CはCでは決して有効ではないからです。 実際のところ、Cは適切なCを探すのに当たって、全てのCメソッドをスキップしてしまいます。 これは制限のように見えるかもしれませんが、私はこの二つの特徴の分割しておく(ただし共同利用できます)ことが、それらの振る舞いを予測しやすくするので、実際にそれらの使用するのを容易にすると言う意見です。 時の経過が、私が正しかったか否かを告げてくれるでしょう。 =back =head1 ACKNOWLEDGEMENTS =over 4 =item 私をメタモデルの狂気に導いたSam Vilainを呪います。 =item 私に#perl6でメタモデル癖を勧めてくれたAudrey Tangを呪います。 =item Yuval "nothingmuch" Kogman抜きではこのモジュールはありえなかったでしょう、そしてこんな名前にもならなかったでしょう ;P =item 型制約モジュールの基礎は元々はRob Kinyonのアイディアであり、私はこれを転がしただけです。 =item mst & chansenと全ての#moose pooseからのアイディア/機能要求/推奨に感謝します。 =item David "Theory" Wheelerのメタディスカッションと綴り間違いの訂正に感謝します。 =back =head1 SEE ALSO =over 4 =item Lドキュメント =item irc.perl.orgの#mooseチャンネル =item L =item L このペーパー(lbrから#mooseで勧められました)がC/CやC/Cの機能の実装に導きました。これらの機能を本当に理解したければ、私からもこれを読むように勧めます。 =back =head1 BUGS 複雑なソフトウェアにはバグが潜むものであり、このモジュールも例外ではありません。 もしバグを見つけたら、私にemailするか、あるいはcpan-RTにバグを追加してください。 =head1 AUTHOR Stevan Little Estevan@iinteractive.comE Christian Hansen Echansen@cpan.orgE Yuval Kogman Enothingmuch@woobling.orgE =head1 COPYRIGHT AND LICENSE Copyright 2006 by Infinity Interactive, Inc. L This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 DOCUMENT TRANSLATION Makio Tsukamoto, tsukamoto@gmail.com =cut