Rename all MX::CA::Role::Meta packages to MX::CA::Trait, which is shorter and less...
[gitmo/MooseX-ClassAttribute.git] / lib / MooseX / ClassAttribute / Trait / Application / ToInstance.pm
1 package MooseX::ClassAttribute::Trait::Application::ToInstance;
2
3 use strict;
4 use warnings;
5
6 use Class::MOP;
7
8 use namespace::autoclean;
9 use Moose::Role;
10
11 after apply => sub {
12     shift->apply_class_attributes(@_);
13 };
14
15 sub apply_class_attributes {
16     my $self   = shift;
17     my $role   = shift;
18     my $object = shift;
19
20     my $class = Moose::Util::MetaRole::apply_metaclass_roles(
21         for             => ref $object,
22         class_metaroles => {
23             class => ['MooseX::ClassAttribute::Trait::Class'],
24         },
25     );
26
27     my $attr_metaclass = $class->attribute_metaclass();
28
29     foreach my $attribute_name ( $role->get_class_attribute_list() ) {
30         if (   $class->has_class_attribute($attribute_name)
31             && $class->get_class_attribute($attribute_name)
32             != $role->get_class_attribute($attribute_name) ) {
33             next;
34         }
35         else {
36             $class->add_class_attribute(
37                 $role->get_class_attribute($attribute_name)
38                     ->attribute_for_class($attr_metaclass) );
39         }
40     }
41 }
42
43 1;