Moose > Moose::Cookbook

題名

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を使ってオブジェクトの生成に割り込む

このレシピではBUILDARGSBUILDを使ってオブジェクトの生成プロセスに割り込む方法を説明します。

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の一部として使いたい場合もあるでしょう(とりわけ新しいメタクラスのクラスやベースオブジェクトクラスをデフォルトにしたい場合)。

おまけ

Moose::Cookbook::Snack::Keywords
Moose::Cookbook::Snack::Types

参照

http://www.gsph.com/index.php?Lang=En&ID=291

作者

Stevan Little <stevan@iinteractive.com>

コピーライト & ライセンス

Copyright 2006-2009 by Infinity Interactive, Inc.

http://www.iinteractive.com

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.