The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Plagger::Rule::FeedAttr;
use strict;
use base qw( Plagger::Rule );

use Plagger::Operator;
use Plagger::Feed;

sub init {
    my $self = shift;

    if (my $attrs = $self->{attrs}) {
	$attrs = [ $attrs ] if ref($attrs) ne 'ARRAY';
	$self->{attrs} = $attrs;
    } else {
	Plagger->context->error("Can't parse attr");
    }
    
    my $feed = Plagger::Feed->new;
    for my $attr (@{$self->{attrs}}) {
	unless ($feed->can($attr->{name})) {
	    Plagger->context->error("Unsupported attr name '$attr->{name}'");
	}
	
	if (my $value = $attr->{value}) {
	    $value = [ $value ] if ref($value) ne 'ARRAY';
	    $self->{value} = $value;
	} else {
	    Plagger->context->error("Can't parse value in '$attr->{name}'");
	}
	    
	$attr->{op} ||= 'OR';
	unless (Plagger::Operator->is_valid_op($attr->{op})) {
	    Plagger->context->error("Unsupported operator $self->{op} in '$attr->{name}'");
	}
    }

    $self->{op} ||= 'OR';
    unless (Plagger::Operator->is_valid_op($self->{op})) {
	Plagger->context->error("Unsupported operator $self->{op}");
    }
}

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

    my $feed = $args->{feed}
        or Plagger->context->error("No feed object in this plugin phase");

    my @bool;
    for my $attr (@{$self->{attrs}}) {
	my @value;
	my $name = $attr->{name};
	for my $want (@{$attr->{value}}) {
	    if ($want =~ m{^/(.+?)/(i?)$}) {
		my ($pattern, $icase) = ($1, $2);
		if ($icase) {
		    push @value, ($feed->$name() =~ m{$pattern}i);
		} else {
		    push @value, ($feed->$name() =~ m{$pattern});
		}
	    } else {
		push @value, ($feed->$name() eq $want);
	    }
	}
	push @bool, Plagger::Operator->call($attr->{op}, @value);
    }

    Plagger::Operator->call($self->{op}, @bool);
}

1;
__END__
example config.
    rule:
      - module: FeedAttr
        op: AND
        attrs: 
          - 
            name: type
            op: NOR
            value:
              - mixi
              - frepa
          -
            name: link
            op: OR
            value:
              - /Yappo/i
              - /bulknews/