=encoding utf8 =pod =head1 題名 Moose::Cookbook::Meta::Recipe1 - メタの世界へようこそ(メタを使うわけ) =head1 要約 まだの方はLを読んでおいた方がよいかもしれません。 「Mooseはすごいけど、×××のやり方が違っていればよかったのに」と思ったことがある方はもうメタの世界に足を踏み入れています。メタのレシピでは、メタクラス(LやLなど)の働きを拡張したりオーバーライドすることでMooseの動作を変えたり拡張する方法を説明します。 メタクラスのAPIは、クラスやロール、アトリビュートなどを記述する一連のクラスからなります。メタクラスのAPIを使うと、クラスに「どんなアトリビュートがあるのか」とか「どんなロールが組み込まれているのか」といった問い合わせができるようになります。 また、メタクラスのシステムを使うと、クラスに、たとえば新しいメソッドやアトリビュートを追加するといった変更を加えることができます。 Lが提供するインタフェース(C、C、C)は、奥に隠れているメタクラスシステムに対する薄いシンタックスシュガーにすぎません。 このメタクラスシステムの動作を拡張したり変更することによって、独自のMooseもどきを作ることもできます。 =head2 例 アトリビュートにプロパティを追加したいとしましょう。具体的にいうと、各アトリビュートに「label」というプロパティを追加して、C<< My::Class->meta()->get_attribute('size')->label() >>と書けるようにしたい、とします。最初の2つのレシピは、これを2通りのやり方で実現するものです(ひとつはメタアトリビュートの完全なサブクラスを利用するやり方、もうひとつはアトリビュートのトレートを利用するやり方です)。 あるいは、メタクラスにもプロパティを追加したい場合もあるかもしれません。たとえば、MooseベースのORMを書いているとしたら、クラスのメタクラスオブジェクトを利用して各クラスにテーブル名を関連づけ、C<< My::Class->meta()->table_name() >>と書けるようにしたくなるかもしれません。 =head1 参照 CPANにあがっているMooseXモジュールの多くは、メタクラスの拡張を実装したものです。その好例としては、LとLなどがあります。もっと複雑な例については、LやLをご覧ください。 =head1 作者 Dave Rolsky Eautarch@urth.org =head1 COPYRIGHT AND LICENSE Copyright 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