Moose > Moose::Cookbook::Meta::Recipe1

題名

Moose::Cookbook::Meta::Recipe1 - メタの世界へようこそ(メタを使うわけ)

要約

まだの方はMoose::Manual::MOPを読んでおいた方がよいかもしれません。

「Mooseはすごいけど、×××のやり方が違っていればよかったのに」と思ったことがある方はもうメタの世界に足を踏み入れています。メタのレシピでは、メタクラス(Moose::Meta::ClassMoose::Meta::Attributeなど)の働きを拡張したりオーバーライドすることでMooseの動作を変えたり拡張する方法を説明します。

メタクラスのAPIは、クラスやロール、アトリビュートなどを記述する一連のクラスからなります。メタクラスのAPIを使うと、クラスに「どんなアトリビュートがあるのか」とか「どんなロールが組み込まれているのか」といった問い合わせができるようになります。

また、メタクラスのシステムを使うと、クラスに、たとえば新しいメソッドやアトリビュートを追加するといった変更を加えることができます。

Moose.pmが提供するインタフェース(haswithextends)は、奥に隠れているメタクラスシステムに対する薄いシンタックスシュガーにすぎません。

このメタクラスシステムの動作を拡張したり変更することによって、独自のMooseもどきを作ることもできます。

アトリビュートにプロパティを追加したいとしましょう。具体的にいうと、各アトリビュートに「label」というプロパティを追加して、My::Class->meta()->get_attribute('size')->label()と書けるようにしたい、とします。最初の2つのレシピは、これを2通りのやり方で実現するものです(ひとつはメタアトリビュートの完全なサブクラスを利用するやり方、もうひとつはアトリビュートのトレートを利用するやり方です)。

あるいは、メタクラスにもプロパティを追加したい場合もあるかもしれません。たとえば、MooseベースのORMを書いているとしたら、クラスのメタクラスオブジェクトを利用して各クラスにテーブル名を関連づけ、My::Class->meta()->table_name()と書けるようにしたくなるかもしれません。

参照

CPANにあがっているMooseXモジュールの多くは、メタクラスの拡張を実装したものです。その好例としては、MooseX::SingletonMooseX::AttributeHelpersなどがあります。もっと複雑な例については、Fey::ORMReactionをご覧ください。

作者

Dave Rolsky <autarch@urth.org<gt>

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

Copyright 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.