題名¶
Moose::Cookbook - Mooseの調理法
本文¶
このクックブックはMooseのさまざまな機能を紹介するレシピを集めたものです。ほとんどのレシピはある機能を紹介するコードを提示してからその詳細を説明するという形になっています。
まだの方はおそらく先にMoose::Manualを読んだ方がよいでしょう。マニュアルの方ではあまりコードを使わずにMooseのコンセプトを説明しています。
レシピ¶
Mooseの基本¶
ここでは、簡単なアトリビュートの宣言から、遅延評価、型、型変換、メソッドモディファイアといった、より強力な機能まで、Mooseの機能の概要をしっかり紹介していきます。
- Moose::Cookbook::Basics::Recipe1 - (毎度おなじみ) Pointの例
-
Mooseを使った簡単なクラスの例です。Mooseのアトリビュートやサブクラス化について説明します。
- Moose::Cookbook::Basics::Recipe2 - 簡単なBankAccountの例
-
もう少し複雑なMooseクラスの例です。サブクラスでメソッドモディファイアを利用する方法を説明します。
- Moose::Cookbook::Basics::Recipe3 - 遅延評価を行うBinaryTreeの例
-
型、ウィークリファレンス、断定(「このオブジェクトにfooはありますか」)、デフォルト値、遅延評価、トリガといった、アトリビュートのいくつかの機能を説明します。
- Moose::Cookbook::Basics::Recipe4 - サブタイプと簡単なCompanyクラス階層のモデリング
-
独自の型の作り方や使い方、
BUILD
メソッド、サブクラスの中でのoverride
の使い方を紹介します。 - Moose::Cookbook::Basics::Recipe5 - サブタイプふたたび、Requestクラスでの型変換
-
型変換の使い方など、型の使用例の続きです。
- Moose::Cookbook::Basics::Recipe6 - augment/innerの例
-
augment
というメソッドモディファイアの使い方を説明します。これは通常のメソッドオーバーライドのやり方を「ひっくり返す」ものです。 - Moose::Cookbook::Basics::Recipe7 - 不変化によるMooseの高速化
-
クラスを不変化するとアクセサやオブジェクトの生成が非常に速くなります。
- Moose::Cookbook::Basics::Recipe8 - ビルダーメソッドとlazy_build
-
builder機能を使うと、アトリビュートのデフォルト値を継承やロールの合成を利用して用意できるようになります。
- Moose::Cookbook::Basics::Recipe9 - 演算子のオーバーロード、サブタイプ、型変換
-
繁殖の際に目の色が決まる様子をまねながら、演算子のオーバーロードやサブタイプ、型変換の使い方を説明します。
- Moose::Cookbook::Basics::Recipe10 - BUILDARGSとBUILDを使ってオブジェクトの生成に割り込む
-
このレシピでは
BUILDARGS
とBUILD
を使ってオブジェクトの生成プロセスに割り込む方法を説明します。 - Moose::Cookbook::Basics::Recipe11 - Mooseを使っていないベースクラスを拡張する
-
このレシピでは、Mooseをいっさい利用していないDateTimeモジュールのサブクラスを、Mooseベースで作成します。
Mooseのロール¶
ここではMooseのロールの使い方を紹介します。
- Moose::Cookbook::Roles::Recipe1 - Moose::Roleの例
-
ときにはトレートやミクスインとも呼ばれるロールの説明をします。ロールはサブクラス化とはまったく異なる方法でコードを再利用する手段を提供するものです。
- Moose::Cookbook::Roles::Recipe2 - 高度なロールの合成――メソッドの排除と別名
-
ときにはロールの一部をクラスに組み込みたいだけとか、ロールをまるごと組み込みたいのにロールのメソッドとクラスのメソッドが衝突してしまうということもあります。メソッドを排除したり別名をつけたりすると、そういった問題に対処できます。
- Moose::Cookbook::Roles::Recipe3 - オブジェクトのインスタンスにロールを組み込む
-
このレシピでは既存のオブジェクトのインスタンスにロールを組み込んでみます。
メタMoose¶
ここでは独自のメタクラスの書き方を紹介します。独自のメタクラスを使うとMooseが提供しているオブジェクトシステムを拡張できます。
- Moose::Cookbook::Meta::Recipe1 - メタの世界へようこそ(メタを使うわけ)
-
この「メタ」というのはいったい何なのだろう、なぜ気にする必要があるのだろうと思われた方は、こちらの「レシピ」をご覧ください。
- Moose::Cookbook::Meta::Recipe2 - メタアトリビュート、ラベル付きのアトリビュート
-
Mooseを拡張する方法のひとつは、独自のアトリビュートメタクラスを提供することです。アトリビュートメタクラスを使うと、(
has
による)アトリビュートの宣言や振る舞いを拡張して、アトリビュートに機能を追加することができます。 - Moose::Cookbook::Meta::Recipe3 - アトリビュートのトレートを利用したラベルの実装
-
Mooseのアトリビュートメタクラスを拡張して機能を追加するのはすばらしいやり方ですが、アトリビュートが持てるメタクラスはひとつしかありません。アトリビュートのメタクラスにロールを組み込めば、アトリビュートの機能を合成できるようになります。
- Moose::Cookbook::Meta::Recipe4 - メタクラスに「table」アトリビュートを追加する
-
もっとクラスの情報を保存したい場合は、
Moose::Meta::Class
を拡張する必要が出てきます。そうするのは簡単ですが、そうするとおそらくシュガー関数も提供したくなるでしょうから、Moose::Cookbook::Extending::Recipe2もあわせてご覧ください。 - Moose::Cookbook::Meta::Recipe5 - メタクラスのトレートとしての「table」アトリビュート
-
このレシピでは前のレシピで見たクラスのメタクラスを、メタクラスのトレートとして再実装します。
- Moose::Cookbook::Meta::Recipe6 - メソッドメタクラスを使ってメソッドをパブリックにしたりプライベートにしたりする
-
このレシピではメソッドのプライベート化を実装した独自のメソッドメタクラスを紹介します。
- Moose::Cookbook::Meta::Recipe7 - グロブリファレンスをメタインスタンスのクラスにする
-
このレシピでは独自のメタインスタンスクラスを作成する例を紹介します。メタインスタンスというのはオブジェクトのインスタンスの内部構造を決定して、アトリビュートスロットへのアクセスを提供するものです。
- Moose::Cookbook::Meta::Recipe8 - 不変化に割り込む (TODO)
-
Mooseには「不変化」という機能があります。クラス(アトリビュートやロールなど)を定義したあとで
__PACKAGE__->meta()->make_immutable()
を呼ぶと、Mooseにオブジェクトの生成やアトリビュートのアクセスなどを最適化させることができます。独自のメタクラスを作成する場合、不変化システムに割り込む必要があるかもしれません。これはメタクラスのクラスやメタメソッドのクラス、それからおそらくメタインスタンスのクラスなど、さまざまな箇所に影響を与えます。
このレシピでは不変化を適切に処理する拡張モジュールの書き方を紹介します。
Mooseを拡張する¶
ここではMooseを拡張する方法をもういくつか取り上げます。自分でMooseX
モジュールを書こうと思っている方には役に立つはずです。
- Moose::Cookbook::Extending::Recipe1 - Mooseの拡張モジュール概観
-
Mooseを拡張する方法はたくさんあります。このレシピではそれぞれの方法の概要を説明して、それぞれどんなときに使うのがよいかを紹介します。
- Moose::Cookbook::Extending::Recipe2 - オブジェクトのベースクラス用のロールを用意する
-
ベースオブジェクトクラスの拡張モジュールにはロールとして実装できるものがたくさんあります。この例では、抽象的な
MooseX::Debugging
モジュールを使っているクラスならどれにでも組み込める、ベースオブジェクトクラスのデバッグ用ロールの作り方を紹介します。 - Moose::Cookbook::Extending::Recipe3 - 別のベースオブジェクトクラスを用意する
-
メタを拡張するだけでなく、別のベースオブジェクトクラスを用意したくなることもあるかもしれません。また、何度も何度も
extends 'MyApp::Base'
とタイプしなくてもすべてのクラスに機能を追加したい場合もあるでしょう。 - Moose::Cookbook::Extending::Recipe4 - Moose.pmのようにMoose風のシュガー関数を提供する
-
このレシピでは
Moose.pm
のかわりになるものを用意するやり方を紹介します。MooseX
モジュールのAPIの一部として使いたい場合もあるでしょう(とりわけ新しいメタクラスのクラスやベースオブジェクトクラスをデフォルトにしたい場合)。
おまけ¶
参照¶
作者¶
Stevan Little <stevan@iinteractive.com>
コピーライト & ライセンス¶
Copyright 2006-2009 by Infinity Interactive, Inc.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.