Moose::Cookbook - Mooseの調理法
このクックブックはMooseのさまざまな機能を紹介するレシピを集めたものです。ほとんどのレシピはある機能を紹介するコードを提示してからその詳細を説明するという形になっています。
まだの方はおそらく先にMoose::Manualを読んだ方がよいでしょう。マニュアルの方ではあまりコードを使わずにMooseのコンセプトを説明しています。
ここでは、簡単なアトリビュートの宣言から、遅延評価、型、型変換、メソッドモディファイアといった、より強力な機能まで、Mooseの機能の概要をしっかり紹介していきます。
Mooseを使った簡単なクラスの例です。Mooseのアトリビュートやサブクラス化について説明します。
もう少し複雑なMooseクラスの例です。サブクラスでメソッドモディファイアを利用する方法を説明します。
型、ウィークリファレンス、断定(「このオブジェクトにfooはありますか」)、デフォルト値、遅延評価、トリガといった、アトリビュートのいくつかの機能を説明します。
独自の型の作り方や使い方、BUILDメソッド、サブクラスの中でのoverrideの使い方を紹介します。
型変換の使い方など、型の使用例の続きです。
augmentというメソッドモディファイアの使い方を説明します。これは通常のメソッドオーバーライドのやり方を「ひっくり返す」ものです。
クラスを不変化するとアクセサやオブジェクトの生成が非常に速くなります。
builder機能を使うと、アトリビュートのデフォルト値を継承やロールの合成を利用して用意できるようになります。
繁殖の際に目の色が決まる様子をまねながら、演算子のオーバーロードやサブタイプ、型変換の使い方を説明します。
このレシピではBUILDARGSとBUILDを使ってオブジェクトの生成プロセスに割り込む方法を説明します。
このレシピでは、Mooseをいっさい利用していないDateTimeモジュールのサブクラスを、Mooseベースで作成します。
ここではMooseのロールの使い方を紹介します。
ときにはトレートやミクスインとも呼ばれるロールの説明をします。ロールはサブクラス化とはまったく異なる方法でコードを再利用する手段を提供するものです。
ときにはロールの一部をクラスに組み込みたいだけとか、ロールをまるごと組み込みたいのにロールのメソッドとクラスのメソッドが衝突してしまうということもあります。メソッドを排除したり別名をつけたりすると、そういった問題に対処できます。
このレシピでは既存のオブジェクトのインスタンスにロールを組み込んでみます。
ここでは独自のメタクラスの書き方を紹介します。独自のメタクラスを使うとMooseが提供しているオブジェクトシステムを拡張できます。
この「メタ」というのはいったい何なのだろう、なぜ気にする必要があるのだろうと思われた方は、こちらの「レシピ」をご覧ください。
Mooseを拡張する方法のひとつは、独自のアトリビュートメタクラスを提供することです。アトリビュートメタクラスを使うと、(hasによる)アトリビュートの宣言や振る舞いを拡張して、アトリビュートに機能を追加することができます。
Mooseのアトリビュートメタクラスを拡張して機能を追加するのはすばらしいやり方ですが、アトリビュートが持てるメタクラスはひとつしかありません。アトリビュートのメタクラスにロールを組み込めば、アトリビュートの機能を合成できるようになります。
もっとクラスの情報を保存したい場合は、Moose::Meta::Classを拡張する必要が出てきます。そうするのは簡単ですが、そうするとおそらくシュガー関数も提供したくなるでしょうから、Moose::Cookbook::Extending::Recipe2もあわせてご覧ください。
このレシピでは前のレシピで見たクラスのメタクラスを、メタクラスのトレートとして再実装します。
このレシピではメソッドのプライベート化を実装した独自のメソッドメタクラスを紹介します。
このレシピでは独自のメタインスタンスクラスを作成する例を紹介します。メタインスタンスというのはオブジェクトのインスタンスの内部構造を決定して、アトリビュートスロットへのアクセスを提供するものです。
Mooseには「不変化」という機能があります。クラス(アトリビュートやロールなど)を定義したあとで__PACKAGE__->meta()->make_immutable()を呼ぶと、Mooseにオブジェクトの生成やアトリビュートのアクセスなどを最適化させることができます。
独自のメタクラスを作成する場合、不変化システムに割り込む必要があるかもしれません。これはメタクラスのクラスやメタメソッドのクラス、それからおそらくメタインスタンスのクラスなど、さまざまな箇所に影響を与えます。
このレシピでは不変化を適切に処理する拡張モジュールの書き方を紹介します。
ここではMooseを拡張する方法をもういくつか取り上げます。自分でMooseXモジュールを書こうと思っている方には役に立つはずです。
Mooseを拡張する方法はたくさんあります。このレシピではそれぞれの方法の概要を説明して、それぞれどんなときに使うのがよいかを紹介します。
ベースオブジェクトクラスの拡張モジュールにはロールとして実装できるものがたくさんあります。この例では、抽象的なMooseX::Debuggingモジュールを使っているクラスならどれにでも組み込める、ベースオブジェクトクラスのデバッグ用ロールの作り方を紹介します。
メタを拡張するだけでなく、別のベースオブジェクトクラスを用意したくなることもあるかもしれません。また、何度も何度もextends 'MyApp::Base'とタイプしなくてもすべてのクラスに機能を追加したい場合もあるでしょう。
このレシピでは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.
