The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;
use FindBin '$Bin';
use lib File::Spec->catdir($Bin, 'lib');
use Hook::Modular::Test ':all';
use Test::More tests => 1;
use parent 'Hook::Modular';

# Test that rules like My::Test::Rule::Maybe can take config themselves.
# specifying the appropriate plugin namespace for this program saves you from
# having to specify it in every config file.
use constant PLUGIN_NAMESPACE => 'My::Test::Plugin';

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

    # Only call the 'init.greet' hook since by default, rules dispatch on the
    # first hook a plugin registers, and the My::Test::Plugin::Just::Greet
    # only registers with one hook, so there's no confusion.
    $self->run_hook('init.greet', { result => \%result });
    is( $result{text},
        ("My::Test::Plugin::Just::Greet says hello\n" x 2),
        'two out of three plugins get dispatched'
    );
}
my $config_filename = write_config_file(
    do { local $/; <DATA> }
);
main->bootstrap(config => $config_filename);
__DATA__
global:
  log:
    level: error
  cache:
    base: /tmp/test-hook-modular
  rule_namespaces: My::Test::Rule

plugins:
  - module: Just::Greet
    rule:
      module: Maybe
      chance: 1
  - module: Just::Greet
    rule:
      module: Maybe
      chance: 0
  - module: Just::Greet
    rule:
      module: Maybe
      chance: 1