The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More tests => 1;
use Test::Fatal;

{
    # role consumer
    package Foo::Bar;

    use strict;
    use Moo;

    with 'Regru::API::Role::Namespace';

    sub available_methods { [qw(foo bar)] }

    1;
}

my $unmet_requirements = qq{
    # invalid consumer
    package Foo::Baz;

    use strict;
    use Moo;

    with 'Regru::API::Role::Namespace';

    1;
};

subtest 'Namespace role' => sub {
    plan tests => 5;

    my $foo = new_ok 'Foo::Bar';

    isa_ok $foo, 'Foo::Bar';
    can_ok $foo, 'available_methods';

    ok $foo->does('Regru::API::Role::Namespace'),       'Instance does the Namespace role';

    my $failed = exception { eval "$unmet_requirements" || die $@ };
    like $failed, qr/^Can't apply .*::Role::Namespace to Foo::Baz/,     'Caught exception during apply role';
};

1;