Plagger::Plugin::Expression

既存のPluginじゃ上手く処理できないんだけど、新しくPlugin書くほどでもないよなーって時に。

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

sub init {
    my $self = shift;
    $self->SUPER::init(@_);

    $self->rule_hook($self->conf->{rule_hook});

    my $hooks = $self->conf->{hooks} or return;
    $hooks = [ $hooks ] unless ref $hooks eq 'ARRAY';

    for my $hook (@$hooks) {
        my $callback = sub {
            eval $hook->{expression};
            Plagger->context->error($@) if ($@);
        };
        push @{$self->{hooks}}, $hook->{hook}, $callback;
    }
}

sub register {
    my ($self, $context) = @_;
    $context->register_hook(
        $self,
        @{$self->{hooks}},
    );
}

1;

__END__

=head1 SYNOPSIS

    - module: Expression
      config:
        rule_hook: smartfeed.entry
        hooks:
          - hook: smartfeed.init
            expression: Plagger->context->log(debug => 'smartfeed.init')
          - hook: smartfeed.entry
            expression: my ($self, $context, $args) = @_; $context->log(debug => $args->{entry}->title)

    - module: Expression
      config:
        hooks:
          hook: update.feed.fixup
          expression: Plagger->context->log(debug => 'update.feed.fixup')
=cut