Plugin::PhaseNotifier

なんとなく作ってみた。
現在のフェーズとそのフェーズで使われるPluginを教えてくれるPlugin。


こういう風にconfig.yaml書くと、

  - module: Subscription::Config
    config:
      feed: 
        - url: http://d.hatena.ne.jp/tayaya/rss
  - module: Publish::Gmail
  - module: Notify::YahooMessenger
  - module: PhaseNotifier

下のようにフェーズとPlugin名が表示される。

Plagger [info] plugin Plagger::Plugin::Subscription::Config loaded.
Plagger [info] plugin Plagger::Plugin::Publish::Gmail loaded.
Plagger [info] plugin Plagger::Plugin::Notify::YahooMessenger loaded.
Plagger [info] plugin Plagger::Plugin::PhaseNotifier loaded.
Plagger::Plugin::PhaseNotifier [info] Phase: subscription.load / Plugins: Subscription::Config
Plagger [info] plugin Plagger::Plugin::Aggregator::Simple loaded.
・
・
・
Plagger::Plugin::Publish::Gmail [info] Sending qw/Perる 日誌/ to xxx@example.com
Plagger::Plugin::Notify::YahooMessenger [info] Notifying qw/Perる 日誌/ to Yahoo Messenger
Plagger::Plugin::PhaseNotifier [info] Phase: publish.feed / Plugins: Publish::Gmail, Notify::YahooMessenger

ソースはこんな感じ。

package Plagger::Plugin::PhaseNotifier;
use strict;
use base qw( Plagger::Plugin );

sub register {
    my($self, $context) = @_;

    my @hooks;
    for my $hook ( keys %{ $context->{hooks} } ) {

        my @plugins = map {
            my $plugin = ref $_->{plugin};
               $plugin =~ s/^Plagger::Plugin:://;
               $plugin;
        } @{ $context->{hooks}->{$hook} };
        
        push @{ $self->{hooks}->{$hook} }, @plugins;
        push @hooks, $hook => \&$hook;
    }

    $context->register_hook(
        $self,
        @hooks,
    );
}

sub AUTOLOAD {
    my($self, $context, $args) = @_;

    (my $phase = our $AUTOLOAD) =~ s/^Plagger::Plugin::PhaseNotifier:://;
    my @plugins = @{ $self->{hooks}->{$phase} };

    $context->log( info => "Phase: $phase / Plugins: " . (join ', ', @plugins) );
    $context->dumper($context) if $self->conf->{context};
    $context->dumper($args)    if $self->conf->{args};
}   

1;