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から入った方がいいのかなー