=encoding utf8 =pod =head1 題名 Moose::Manual::Classes - クラスにMooseを使わせたり、サブクラス化したりする =head1 Mooseを使う Mooseの使い方は非常に簡単、Cするだけです。 package Person; use Moose; これでMooseを使ったクラスができました! もっとも、その裏では本当はいろいろなことが起こっています。ひとつひとつ見ていきましょう。 Lをロードすると、C、C、Cといったシュガー関数が山ほどクラスにエクスポートされます。これらの関数はクラスを定義するときに使います。たとえば、アトリビュートを定義したい場合はこのようにします。 package Person; use Moose; has 'ssn' => ( is => 'rw' ); アトリビュートについてはLのドキュメントをご覧ください。 また、MooseをロードしたクラスではCプラグマとCプラグマも有効になります。 Mooseをロードすると、そのクラスはLのサブクラスになります。Lクラスにはデフォルトのコンストラクタやデストラクタのほか、オブジェクトを生成するヘルパーメソッドがあります。詳しくはLのドキュメントをご覧ください。 また、Mooseは便利に使えるように、そのクラスのために新しい型も生成します。型についてはLのドキュメントをご覧ください。 さらに、そのクラスのLオブジェクトも生成します。このメタクラスオブジェクトは、C<< Person->meta >>のようにクラスのCメソッドを呼ぶと利用できます。 このメタクラスオブジェクトは、イントロスペクション用のAPIを提供します。Mooseも裏ではこのAPIを使ってアトリビュートを追加したり親クラスを定義したりしています。実は、Mooseのシュガー関数はどれも、実際にしているのはこのメタクラスオブジェクト(や、ほかのメタAPIオブジェクト)のメソッドを呼ぶことなのです。 =head1 サブクラス化 Mooseは親クラスを宣言するためにCという簡単なシュガー関数を提供しています。 package User; use Moose; extends 'Person'; has 'username' => ( is => 'rw' ); なお、親クラスはCを呼ぶたびに「リセット」されます。多重継承したい場合は、Cのようにすべての親クラスを一度に指定する必要があります。 Mooseを使っていない親クラスをMooseを使って継承することもできますが、その場合、親クラスのコンストラクタを継承することになりますので(親クラスのコンストラクタもCという名前であれば、ですが)、アトリビュートの初期化は自分で(親クラスのコンストラクタか、サブクラスの中で)しなければなりませんし、Mooseの魔法もかなり使えなくなります。 =head1 no Moose Mooseのシュガー関数はクラスの名前空間から削除することもできます。この機能を使うととにかくクラスが「きれい」になるのでおすすめです。この機能は、モジュールファイルの末尾にCを追加するだけで使えます。 package Person; use Moose; has 'ssn' => ( is => 'rw' ); no Moose; こうするとMooseのシュガー関数がクラスの名前空間から消えるので、C<< Person->can('has') >>が真を返さなくなります。 Lを含め、それ以外のキーワードのエクスポート除去も行うさらに一般的な手法としてはLやLがあります。 =head1 高速化する Mooseには「不変化」という機能があります。この機能を使うと、実行時にクラスを大幅に高速化できます。ただし、この機能を使うと、クラスをはじめてロードするときにはコストがかかります。また、クラスを不変化すると、その先クラスを変更してアトリビュートやメソッド、ロールなどを追加することはできなくなります。 ただし、そのおかげでMooseはそのクラス専用のコードを生成することができるようになります。とりわけ「インライン」コンストラクタを生成するので、オブジェクトの生成が非常に速くなります。 クラスを不変化するには、単にそのクラスのメタクラスオブジェクトのCを呼んでください。 __PACKAGE__->meta->make_immutable; =head2 不変化とC クラスのCをオーバーライドしてしまうと、不変化用のコードがクラスに最適化したコンストラクタを用意できなくなってしまうので、Cメソッドを使うようにしてください。Cメソッドはインライン展開されたコンストラクタからも呼ばれます。 または、どうしても別のCを用意する必要がある場合は、自前の不変化メソッドを用意することもできます。そのためにはMooseのメタクラスを拡張する必要がありますが、それについてはこのマニュアルでは取り扱いません。 =head1 作者 Dave Rolsky Eautarch@urth.orgE =head1 COPYRIGHT AND LICENSE Copyright 2008-2009 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. =cut