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 0.88;

BEGIN {
    require Moose;
    if (Moose->VERSION < 1.9900) {
        plan skip_all => q{this test isn't relevant on Moose 1.x};
    }
}

{
    package Foo::Meta::Role::Attribute;
    use Moose::Role;

    has foo => (is => 'ro');
}

{
    package Foo::Exporter;
    use Moose::Exporter;
    Moose::Exporter->setup_import_methods(
        role_metaroles => {
            applied_attribute => ['Foo::Meta::Role::Attribute'],
        },
    );
}

{
    package Foo::Role1;
    use MooseX::Role::Parameterized;

    role {
        my $p = shift;
        my %args = @_;
        Foo::Exporter->import({into => $args{operating_on}->name});

        has foo => (is => 'ro', foo => 'bar');
    };
}

{
    package Foo1;
    use Moose;
    with 'Foo::Role1';
}

{
    is(
        Foo1->meta->find_attribute_by_name('foo')->foo, 'bar',
        'applied_attribute metaroles work when applied to generated role'
    );
}

{
    package Foo::Role2;
    use MooseX::Role::Parameterized;
    Foo::Exporter->import;

    has foo => (is => 'ro', foo => 'bar');

    role {
        my $p = shift;

        has bar => (is => 'ro');
    };
}

{
    package Foo2;
    use Moose;
    with 'Foo::Role2';
}

{
    is(Foo2->meta->find_attribute_by_name('foo')->foo, 'bar',
       'applied_attribute metaroles work when applied to parameterizable role');
}

{
    package Foo::Role3;
    use MooseX::Role::Parameterized;

    has foo => (is => 'ro', foo => 'bar');

    role {
        my $p = shift;

        has bar => (is => 'ro');
    };

    Foo::Exporter->import;
}

{
    package Foo3;
    use Moose;
    with 'Foo::Role3';
}

{
    is(Foo3->meta->find_attribute_by_name('foo')->foo, 'bar',
       'applied_attribute metaroles work when applied to parameterizable role after the role block has been defined');
}

done_testing;