=encoding utf8 =pod =head1 題名 Moose::Cookbook - Mooseの調理法 =head1 本文 このクックブックはMooseのさまざまな機能を紹介するレシピを集めたものです。ほとんどのレシピはある機能を紹介するコードを提示してからその詳細を説明するという形になっています。 まだの方はおそらく先にLを読んだ方がよいでしょう。マニュアルの方ではあまりコードを使わずにMooseのコンセプトを説明しています。 =head1 レシピ =head2 Mooseの基本 ここでは、簡単なアトリビュートの宣言から、遅延評価、型、型変換、メソッドモディファイアといった、より強力な機能まで、Mooseの機能の概要をしっかり紹介していきます。 =over 4 =item L - (毎度おなじみ) Bの例 Mooseを使った簡単なクラスの例です。Mooseのアトリビュートやサブクラス化について説明します。 =item L - 簡単なBの例 もう少し複雑なMooseクラスの例です。サブクラスでメソッドモディファイアを利用する方法を説明します。 =item L - 遅延評価を行うBの例 型、ウィークリファレンス、断定(「このオブジェクトにfooはありますか」)、デフォルト値、遅延評価、トリガといった、アトリビュートのいくつかの機能を説明します。 =item L - サブタイプと簡単なBクラス階層のモデリング 独自の型の作り方や使い方、Cメソッド、サブクラスの中でのCの使い方を紹介します。 =item L - サブタイプふたたび、Bクラスでの型変換 型変換の使い方など、型の使用例の続きです。 =item L - augment/innerの例 Cというメソッドモディファイアの使い方を説明します。これは通常のメソッドオーバーライドのやり方を「ひっくり返す」ものです。 =item L - 不変化によるMooseの高速化 クラスを不変化するとアクセサやオブジェクトの生成が非常に速くなります。 =item L - ビルダーメソッドとlazy_build builder機能を使うと、アトリビュートのデフォルト値を継承やロールの合成を利用して用意できるようになります。 =item L - 演算子のオーバーロード、サブタイプ、型変換 繁殖の際に目の色が決まる様子をまねながら、演算子のオーバーロードやサブタイプ、型変換の使い方を説明します。 =item L - BUILDARGSとBUILDを使ってオブジェクトの生成に割り込む このレシピではCとCを使ってオブジェクトの生成プロセスに割り込む方法を説明します。 =item L - Mooseを使っていないベースクラスを拡張する このレシピでは、Mooseをいっさい利用していないLモジュールのサブクラスを、Mooseベースで作成します。 =back =head2 Mooseのロール ここではMooseのロールの使い方を紹介します。 =over 4 =item L - Moose::Roleの例 ときにはトレートやミクスインとも呼ばれるロールの説明をします。ロールはサブクラス化とはまったく異なる方法でコードを再利用する手段を提供するものです。 =item L - 高度なロールの合成――メソッドの排除と別名 ときにはロールの一部をクラスに組み込みたいだけとか、ロールをまるごと組み込みたいのにロールのメソッドとクラスのメソッドが衝突してしまうということもあります。メソッドを排除したり別名をつけたりすると、そういった問題に対処できます。 =item L - オブジェクトのインスタンスにロールを組み込む このレシピでは既存のオブジェクトのインスタンスにロールを組み込んでみます。 =back =head2 メタMoose ここでは独自のメタクラスの書き方を紹介します。独自のメタクラスを使うとMooseが提供しているオブジェクトシステムを拡張できます。 =over 4 =item L - メタの世界へようこそ(メタを使うわけ) この「メタ」というのはいったい何なのだろう、なぜ気にする必要があるのだろうと思われた方は、こちらの「レシピ」をご覧ください。 =item L - メタアトリビュート、ラベル付きのアトリビュート Mooseを拡張する方法のひとつは、独自のアトリビュートメタクラスを提供することです。アトリビュートメタクラスを使うと、(Cによる)アトリビュートの宣言や振る舞いを拡張して、アトリビュートに機能を追加することができます。 =item L - アトリビュートのトレートを利用したラベルの実装 Mooseのアトリビュートメタクラスを拡張して機能を追加するのはすばらしいやり方ですが、アトリビュートが持てるメタクラスはひとつしかありません。アトリビュートのメタクラスにロールを組み込めば、アトリビュートの機能を合成できるようになります。 =item L - メタクラスに「table」アトリビュートを追加する もっとクラスの情報を保存したい場合は、Cを拡張する必要が出てきます。そうするのは簡単ですが、そうするとおそらくシュガー関数も提供したくなるでしょうから、Lもあわせてご覧ください。 =item L - メタクラスのトレートとしての「table」アトリビュート このレシピでは前のレシピで見たクラスのメタクラスを、メタクラスのトレートとして再実装します。 =item L - メソッドメタクラスを使ってメソッドをパブリックにしたりプライベートにしたりする このレシピではメソッドのプライベート化を実装した独自のメソッドメタクラスを紹介します。 =item L - グロブリファレンスをメタインスタンスのクラスにする このレシピでは独自のメタインスタンスクラスを作成する例を紹介します。メタインスタンスというのはオブジェクトのインスタンスの内部構造を決定して、アトリビュートスロットへのアクセスを提供するものです。 =item Moose::Cookbook::Meta::Recipe8 - 不変化に割り込む (TODO) Mooseには「不変化」という機能があります。クラス(アトリビュートやロールなど)を定義したあとでC<< __PACKAGE__->meta()->make_immutable() >>を呼ぶと、Mooseにオブジェクトの生成やアトリビュートのアクセスなどを最適化させることができます。 独自のメタクラスを作成する場合、不変化システムに割り込む必要があるかもしれません。これはメタクラスのクラスやメタメソッドのクラス、それからおそらくメタインスタンスのクラスなど、さまざまな箇所に影響を与えます。 このレシピでは不変化を適切に処理する拡張モジュールの書き方を紹介します。 =back =head2 Mooseを拡張する ここではMooseを拡張する方法をもういくつか取り上げます。自分でCモジュールを書こうと思っている方には役に立つはずです。 =over 4 =item L - Mooseの拡張モジュール概観 Mooseを拡張する方法はたくさんあります。このレシピではそれぞれの方法の概要を説明して、それぞれどんなときに使うのがよいかを紹介します。 =item L - オブジェクトのベースクラス用のロールを用意する ベースオブジェクトクラスの拡張モジュールにはロールとして実装できるものがたくさんあります。この例では、抽象的なCモジュールを使っているクラスならどれにでも組み込める、ベースオブジェクトクラスのデバッグ用ロールの作り方を紹介します。 =item L - 別のベースオブジェクトクラスを用意する メタを拡張するだけでなく、別のベースオブジェクトクラスを用意したくなることもあるかもしれません。また、何度も何度もCとタイプしなくてもすべてのクラスに機能を追加したい場合もあるでしょう。 =item L - Moose.pmのようにMoose風のシュガー関数を提供する このレシピではCのかわりになるものを用意するやり方を紹介します。CモジュールのAPIの一部として使いたい場合もあるでしょう(とりわけ新しいメタクラスのクラスやベースオブジェクトクラスをデフォルトにしたい場合)。 =back =head1 おまけ =over 4 =item L =item L =back =head1 参照 =over 4 =item L =back =head1 作者 Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE Copyright 2006-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