=encoding utf8 =pod =head1 題名 Moose::Cookbook::Extending::Recipe3 - 別のベースオブジェクトクラスを用意する =head1 概要 package MyApp::Base; use Moose; extends 'Moose::Object'; before 'new' => sub { warn "Making a new " . $_[0] }; no Moose; package MyApp::UseMyBase; use Moose (); use Moose::Exporter; Moose::Exporter->setup_import_methods( also => 'Moose' ); sub init_meta { shift; return Moose->init_meta( @_, base_class => 'MyApp::Base' ); } =head1 本文 よくある拡張モジュールとしては、ベースクラスの代用品を提供するものがあります。Cを用意して、アプリケーションのすべてのクラスにC>を追加するのもひとつのやり方ですが、これはかなり面倒です。そのかわりにCをベースオブジェクトクラスにしてくれるMooseもどきのモジュールを作りましょう。 そうすれば、C<< S >>と書くかわりにC>と書くことができるようになります。 この例のベースクラスは新しいオブジェクトを生成するたびにデバッグ用の情報を出力しますが、みなさんが自分でベースクラスを作るときはもっとおもしろい使い方を考えてみてください。 ここではLの魔法を利用します。C<< Moose::Exporter->setup_import_methods( also => 'Moose' ) >>を呼ぶと、CメソッドとCメソッドを用意してくれます。C<< also => 'Moose' >>の部分は、Mooseがエクスポートするものはすべてエクスポートしてほしい、という意味です。 ここで作成されたCメソッドは、私たちのCメソッドを呼び出し、C<< for_caller => $caller >>という引数を渡します。このC<$caller>は、実際にはじめてimportを実行したクラスになります。 LのAPIについてはLのドキュメントをご覧ください。 =head1 MyApp::UseMyBaseを使う 実際に私たちの新しいベースクラスを使いたいときは単にCの「かわり」にCをuseしてください。これで、Mooseのすべてのシュガー関数と、私たちの新しいベースクラスが利用できるようになります。 package Foo; use MyApp::UseMyBase; has 'size' => ( is => 'rw' ); no MyApp::UseMyBase; =head1 まとめ 単純なベースクラスだったわりにはずいぶん大げさな魔法を使いましたが、ベースクラスを拡張するモジュールにはよくメタクラスのトレートを合成したくなるものですし、そのような時にはこのテクニックが役に立ちます。 =head1 作者 Dave Rolsky Eautarch@urth.orgE =head1 COPYRIGHT AND LICENSE Copyright 2006-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