1package Plagger::Rule::EntryTag;
2use strict;
3use base qw( Plagger::Rule );
4
5use Plagger::Operator;
6use Plagger::Tag;
7
8sub init {
9    my $self = shift;
10
11    unless (ref($self->{tag})) {
12        $self->{tag} = [ Plagger::Tag->parse($self->{tag}) ];
13    }
14
15    $self->{op}   ||= 'AND';
16
17    unless (Plagger::Operator->is_valid_op($self->{op})) {
18        Plagger->context->error("Unsupported operator $self->{op}");
19    }
20}
21
22sub id {
23    my $self = shift;
24    return "tag:" . join '+', @{$self->{tag}};
25}
26
27sub as_title {
28    my $self = shift;
29    return "tagged with " . join(" $self->{op} ", map "'$_'", @{$self->{tag}});
30}
31
32sub dispatch {
33    my($self, $args) = @_;
34
35    my $entry = $args->{entry}
36        or Plagger->context->error("No entry object in this plugin phase");
37
38    my @bool;
39    for my $want (@{$self->{tag}}) {
40        push @bool, $entry->has_tag($want);
41    }
42
43    Plagger::Operator->call($self->{op}, @bool);
44}
45
461;
47