Plaggerのフック機構だけを取り出してみる - 試作編
読了まで:約0分
概要: 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 の
プラグインにregister_hook
呼び出して
今の
とり
#FIXME