refactor code to allow for class attributes in roles
[gitmo/MooseX-ClassAttribute.git] / lib / MooseX / ClassAttribute / Role / Meta / Mixin / HasClassAttributes.pm
index 82144d8..46b5a6e 100644 (file)
@@ -21,8 +21,40 @@ has _class_attribute_map => (
     init_arg => undef,
 );
 
+# deprecated
 sub get_class_attribute_map {
     return $_[0]->_class_attribute_map();
 }
 
+sub add_class_attribute {
+    my $self      = shift;
+    my $attribute = shift;
+
+    ( $attribute->isa('Class::MOP::Mixin::AttributeCore') )
+        || confess
+        "Your attribute must be an instance of Class::MOP::Mixin::AttributeCore (or a subclass)";
+
+    $self->_attach_class_attribute($attribute);
+
+    my $attr_name = $attribute->name;
+
+    $self->remove_class_attribute($attr_name)
+        if $self->has_class_attribute($attr_name);
+
+    my $order = ( scalar keys %{ $self->_attribute_map } );
+    $attribute->_set_insertion_order($order);
+
+    $self->_add_class_attribute( $attr_name => $attribute );
+
+    # This method is called to allow for installing accessors. Ideally, we'd
+    # use method overriding, but then the subclass would be responsible for
+    # making the attribute, which would end up with lots of code
+    # duplication. Even more ideally, we'd use augment/inner, but this is
+    # Class::MOP!
+    $self->_post_add_class_attribute($attribute)
+        if $self->can('_post_add_class_attribute');
+
+    return $attribute;
+}
+
 1;