カラクリサイクル

『輝かしい青春』なんて失かった人の雑記

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にアップするとか考えてない。というか正直公開していいものかどうか自信が無い。

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