Devel::REPLのプラグイン(2)
つづき。
2つめが、Plugin::CommandstなどにあるBEFORE_PLUGINとかAFTER_PLUGIN。
こいつらはどこで呼ばれるんだろうと思ってソース追っかけたら、Devel::REPL::Meta::Pluginにあった。
package Devel::REPL::Meta::Plugin; use Moose; use Data::Dumper; extends 'Moose::Meta::Role'; before 'apply' => sub { my ($self, $other) = @_; if (my $pre = $self->get_method('BEFORE_PLUGIN')) { $pre->body->($other, $self); } }; after 'apply' => sub { my ($self, $other) = @_; if (my $pre = $self->get_method('AFTER_PLUGIN')) { $pre->body->($other, $self); } };
Moose::Meta::Roleのapplyをbefore/afterするみたい。
applyをhookしたいときは、use Devel::REPL::Plugin;してBEFORE_PLUGIN()やAFTER_PLUGIN()を定義しとけば、
MooseX::Object::Pluggable->_load_and_apply_role()で$role->meta->apply($self)するときに実行される。
初期化処理とかに使うのかな。
ん〜難しいなあ。
Mooseのコード読んでるとすぐに迷子になる。。。
Class::MOPから入った方がいいのかなー