題名¶
Moose::Cookbook::Extending::Recipe4 - Moose.pmのようにMoose風のシュガー関数を提供する
概要¶
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' );
本文¶
このレシピではMoose::Cookbook::Extending::Recipe1で見たMoose::Exporterの使い方を拡張して、自前のオブジェクトベースクラスを用意するかわりに、自前のメタクラスのクラスを用意して、has_table
というシュガー関数をエクスポートします。
上記のコードを用意すれば、use Moose
はすべてuse MyApp::Mooseish
で置き換えることができます。同様に、no Moose
もno MyApp::Mooseish
で置き換えられます。
with_meta
パラメータには、エクスポートする前にラップしておきたい関数のリストを指定します。ラッパが保証するのは、関数の第1引数がインポートするパッケージのメタオブジェクトになることだけです(だから、my $meta = shift;
とできます)。
Moose::ExporterのAPIについてはMoose::Exporterのドキュメントをご覧ください。
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;
use MyApp::Mooseish
すれば、通常のMooseのシュガー関数(has()
やwith()
など)もすべて利用できます。
まとめ¶
拡張モジュールにシュガー関数を用意すると、よりMooseっぽく見えるようになります。拡張モジュールの例としては、Fey::ORMをご覧ください。
作者¶
Dave Rolsky <autarch@urth.org>
コピーライト & ライセンス¶
Copyright 2006-2009 by Infinity Interactive, Inc.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.