空繰再繰

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

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

Trackbacks

TrackBack ping me at

Comments

Post a comment

コメントを投稿する前にコメントについてをお読みください。

(メールアドレスは表示されません)