Plaggerのフック機構だけを取り出してみる - 試作編

概要: Plaggerのフック機構だけを取り出したモジュールを試作してみた。


Plaggerのフック機構を再利用できるようにモジュールに切り出してみた。

こんな感じ。

package Class::Hooker;
use strict;
use warnings;
sub register_hook {
my ( $self, $plugin, @hooks ) = @_;
while ( my ( $hook, $callback ) = splice @hook, 0, 2 ) {
unless ( $self->{'hooks'}->{$hook} ) {
$self->{'hooks'}->{$hook} = [];
}
my $data= {
plugin      => $plugin,
callback    => $callback,
};
push @{ $self->{'hooks'}->{$hook} }, $data;
}
}
sub run_hook {
my ( $self, $hook, $args, $once, $callback, $process ) = @_;
$process ||= sub {
my ( $action, $args, $callback ) = @_;
$args ||= [];
$args =  [[ $args ]]  if ( ref $args ne 'ARRAY' );
my $plugin = $action->{'plugin'};
my $result = $action->{'callback'}->( $plugin, @{ $args } );
$callback->( $result ) if $callback;
return $result;
};
my $hooks = $self->{'hooks'}->{$hook} || [];
$hooks =  [[ $hooks ]]  if ( ref $hook ne 'ARRAY' );
my @results = ();
for my $action ( @{ $self->{'hooks'}->{$hook} } ) {
my $result = $process->( $action, $args, $callback );
if ( $once ) {
return $result if defined $result;
}
else {
push @results, $result;
}
}
return if $once;
return @results;
}
sub run_hook_once {
my ( $self, $hook, $args, $callback, $process ) = @_;
return $self->run_hook( $hook, $args, 1, $callback, $process );
}

PlaggerのコードがベースになっているのでライセンスはPlaggerと同じPerlのライセンス、 でいいんだろうか?問題があれば変更するので確実では無いかも。

プラグインに該当するモジュールをどういう風に読み込むかとか、 register_hook呼び出してフックを登録するとかは、 実装によって変わってくるだろうと言うことでClass::Hookerでは定義して無い。 あと実際には継承して使うことを前提にコード書いてある。

今のところCPANにアップするとか考えてない。というか正直公開していいものかどうか自信が無い。

とりあえず、こういうの考えましたよということで。

#FIXME

nyarla が大体

Scrapbox でコメントや意見を書く