MooseX::ClassAttribute::Trait::Application::ToRole - A trait that supports applying class attributes to roles


MooseX-ClassAttribute documentation Contained in the MooseX-ClassAttribute distribution.

Index


Code Index:

NAME

Top

MooseX::ClassAttribute::Trait::Application::ToRole - A trait that supports applying class attributes to roles

VERSION

Top

version 0.26

DESCRIPTION

Top

This trait is used to allow the application of roles containing class attributes to roles.

BUGS

Top

See MooseX::ClassAttribute for details.

AUTHOR

Top

Dave Rolsky <autarch@urth.org>

COPYRIGHT AND LICENSE

Top


MooseX-ClassAttribute documentation Contained in the MooseX-ClassAttribute distribution.

package MooseX::ClassAttribute::Trait::Application::ToRole;
BEGIN {
  $MooseX::ClassAttribute::Trait::Application::ToRole::VERSION = '0.26';
}

use strict;
use warnings;

use Moose::Util::MetaRole;
use MooseX::ClassAttribute::Trait::Application::ToClass;

use namespace::autoclean;
use Moose::Role;

with 'MooseX::ClassAttribute::Trait::Application';

around apply => sub {
    my $orig  = shift;
    my $self  = shift;
    my $role1 = shift;
    my $role2 = shift;

    $role2 = Moose::Util::MetaRole::apply_metaroles(
        for            => $role2,
        role_metaroles => {
            role => ['MooseX::ClassAttribute::Trait::Role'],
            application_to_class =>
                ['MooseX::ClassAttribute::Trait::Application::ToClass'],
            application_to_role =>
                ['MooseX::ClassAttribute::Trait::Application::ToRole'],
        },
    );

    $self->$orig( $role1, $role2 );
};

sub _apply_class_attributes {
    my $self  = shift;
    my $role1 = shift;
    my $role2 = shift;

    foreach my $attribute_name ( $role1->get_class_attribute_list() ) {
        if (   $role2->has_class_attribute($attribute_name)
            && $role2->get_class_attribute($attribute_name)
            != $role1->get_class_attribute($attribute_name) ) {

            require Moose;
            Moose->throw_error( "Role '"
                    . $role1->name()
                    . "' has encountered a class attribute conflict "
                    . "during composition. This is fatal error and cannot be disambiguated."
            );
        }
        else {
            $role2->add_class_attribute(
                $role1->get_class_attribute($attribute_name)->clone() );
        }
    }
}

1;

# ABSTRACT: A trait that supports applying class attributes to roles




__END__