=encoding utf8 =pod =head1 題名 Moose::Cookbook::Extending::Recipe4 - Moose.pmのようにMoose風のシュガー関数を提供する =head1 概要 package MyApp::Mooseish; use Moose (); use Moose::Exporter; Moose::Exporter->setup_import_methods( with_meta => ['has_table'], also => 'Moose', ); sub init_meta { shift; return Moose->init_meta( @_, metaclass => 'MyApp::Meta::Class' ); } sub has_table { my $meta = shift; $meta->table(shift); } package MyApp::Meta::Class; use Moose; extends 'Moose::Meta::Class'; has 'table' => ( is => 'rw' ); =head1 本文 このレシピではLで見たLの使い方を拡張して、自前のオブジェクトベースクラスを用意するかわりに、自前のメタクラスのクラスを用意して、Cというシュガー関数をエクスポートします。 上記のコードを用意すれば、CはすべてCで置き換えることができます。同様に、CもCで置き換えられます。 Cパラメータには、エクスポートする前にラップしておきたい関数のリストを指定します。ラッパが保証するのは、関数の第1引数がインポートするパッケージのメタオブジェクトになることだけです(だから、C>とできます)。 LのAPIについてはLのドキュメントをご覧ください。 =head1 MyApp::Mooseishを使う ここまで見てきたコードの目的は、Mooseのようなインタフェースを提供することでした。実際にはこのような使い方をします。 package MyApp::User; use MyApp::Mooseish; has_table 'User'; has 'username' => ( is => 'ro' ); has 'password' => ( is => 'ro' ); sub login { ... } no MyApp::Mooseish; Cすれば、通常のMooseのシュガー関数(CやCなど)もすべて利用できます。 =head1 まとめ 拡張モジュールにシュガー関数を用意すると、よりMooseっぽく見えるようになります。拡張モジュールの例としては、Lをご覧ください。 =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. =pod