1package Plagger::Rules;
2use strict;
3use Plagger::Operator;
4
5sub new {
6    my($class, $op, @rules) = @_;
7    Plagger::Operator->is_valid_op(uc($op))
8        or Plagger->context->error("operator $op not supported");
9
10    bless {
11        op => uc($op),
12        rules => [ map Plagger::Rule->new($_), @rules ],
13    }, $class;
14}
15
16sub dispatch {
17    my($self, $plugin, $hook, $args) = @_;
18
19    return 1 unless $plugin->dispatch_rule_on($hook);
20
21    my @bool;
22    for my $rule (@{ $self->{rules} }) {
23        push @bool, ($rule->dispatch($args) ? 1 : 0);
24    }
25
26    # can't find rules for this phase: execute it
27    return 1 unless @bool;
28
29    Plagger::Operator->call($self->{op}, @bool);
30}
31
32sub id {
33    my $self = shift;
34    join '|', map $_->id, @{$self->{rules}};
35}
36
37sub as_title {
38    my $self = shift;
39    join " $self->{op} ", map $_->as_title, @{$self->{rules}};
40}
41
421;
43