Moose::Cookbook::Snack::Keywords - Mooseの禁句
MooseはPerlの組み込み関数をエミュレートするために多数のシュガー関数をエクスポートしますが、これらのシュガー関数は、ほかのユーザ定義の関数と衝突することがあります。このドキュメントでは簡単に参照できるよう、そういったキーワードの一覧を提供します。
たいていの衝突は避けられますが、use Mooseしたらmetaがインポートされてしまうのは避けられません。このmetaをオーバーライドしたり、挙動を変えると、Mooseの内部を壊すことになりかねません。
MooseやMoose::Roleを使うときに避けるべきキーワードは次の通りです。
Moose::Util::TypeConstraintsを使うときに避けるべきキーワードは次の通りです。
Mooseがエクスポートするシュガー関数は、コードの末尾にno Mooseを加えるだけで取り除くことができます。
package Thing; use Moose; # code here no Moose;
こうすると、Mooseが最初にエクスポートしていたシュガー関数がエクスポートされなくなります。Moose::RoleやMoose::Util::TypeConstraintsも同じやり方でシュガー関数を取り除けます。
Moose、Moose::Role、Moose::Util::TypeConstraintsはいずれもSub::Exporterを使ってエクスポートの処理を行っています。つまり、これらのクラスではSub::Exporterが提供しているすべての機能を利用できるということです。
たとえば、Sub::Exporterを使うと、このようにキーワードをリネームすることもできます。
package LOL::Cat;
use Moose 'has' => { -as => 'i_can_haz' };
i_can_haz 'cheeseburger' => (
is => 'rw',
trigger => sub { print "NOM NOM" }
);
LOL::Cat->new->cheeseburger('KTHNXBYE');
詳細はSub::Exporterのドキュメントをご覧ください。
namespace::cleanを使って名前空間をきれいにすることもできます。ただし、この場合はmetaを取り除いてしまわないよう注意しなければなりません。
package Foo; use Moose; use namespace::clean -except => 'meta'; # ...
John Goulah <jgoulah@cpan.org<gt>
Stevan Little <stevan@iinteractive.com>
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.
