our
$VERSION
=
'1.10'
;
$VERSION
=
eval
$VERSION
;
our
$AUTHORITY
=
'cpan:STEVAN'
;
sub
_attribute_map {
$_
[0]->{
'attributes'
} }
sub
attribute_metaclass {
$_
[0]->{
'attribute_metaclass'
} }
sub
add_attribute {
my
$self
=
shift
;
my
$attribute
= blessed(
$_
[0] ) ?
$_
[0] :
$self
->attribute_metaclass->new(
@_
);
(
$attribute
->isa(
'Class::MOP::Mixin::AttributeCore'
) )
|| confess
"Your attribute must be an instance of Class::MOP::Mixin::AttributeCore (or a subclass)"
;
$self
->_attach_attribute(
$attribute
);
my
$attr_name
=
$attribute
->name;
$self
->remove_attribute(
$attr_name
)
if
$self
->has_attribute(
$attr_name
);
my
$order
= (
scalar
keys
%{
$self
->_attribute_map } );
$attribute
->_set_insertion_order(
$order
);
$self
->_attribute_map->{
$attr_name
} =
$attribute
;
$self
->_post_add_attribute(
$attribute
)
if
$self
->can(
'_post_add_attribute'
);
return
$attribute
;
}
sub
has_attribute {
my
(
$self
,
$attribute_name
) =
@_
;
(
defined
$attribute_name
)
|| confess
"You must define an attribute name"
;
exists
$self
->_attribute_map->{
$attribute_name
};
}
sub
get_attribute {
my
(
$self
,
$attribute_name
) =
@_
;
(
defined
$attribute_name
)
|| confess
"You must define an attribute name"
;
return
$self
->_attribute_map->{
$attribute_name
};
}
sub
remove_attribute {
my
(
$self
,
$attribute_name
) =
@_
;
(
defined
$attribute_name
)
|| confess
"You must define an attribute name"
;
my
$removed_attribute
=
$self
->_attribute_map->{
$attribute_name
};
return
unless
defined
$removed_attribute
;
delete
$self
->_attribute_map->{
$attribute_name
};
return
$removed_attribute
;
}
sub
get_attribute_list {
my
$self
=
shift
;
keys
%{
$self
->_attribute_map };
}
sub
_restore_metaattributes_from {
my
$self
=
shift
;
my
(
$old_meta
) =
@_
;
for
my
$attr
(
sort
{
$a
->insertion_order <=>
$b
->insertion_order }
map
{
$old_meta
->get_attribute(
$_
) }
$old_meta
->get_attribute_list) {
$attr
->_make_compatible_with(
$self
->attribute_metaclass);
$self
->add_attribute(
$attr
);
}
}
1;