init_arg => undef,
);
-sub add_class_attribute {
+around add_class_attribute => sub {
+ my $orig = shift;
my $self = shift;
-
- my $attr
- = blessed $_[0] && $_[0]->isa('Class::MOP::Attribute')
+ my $attr = (
+ blessed $_[0] && $_[0]->isa('Class::MOP::Attribute')
? $_[0]
- : $self->_process_class_attribute(@_);
+ : $self->_process_class_attribute(@_)
+ );
- my $name = $attr->name();
+ $self->$orig($attr);
- $self->remove_class_attribute($name)
- if $self->has_class_attribute($name);
+ return $attr;
+};
- $attr->attach_to_class($self);
+sub _post_add_class_attribute {
+ my $self = shift;
+ my $attr = shift;
- $self->_add_class_attribute( $name => $attr );
+ my $name = $attr->name();
my $e = do {
local $@;
$self->remove_attribute($name);
die $e;
}
+}
- return $attr;
+sub _attach_class_attribute {
+ my ($self, $attribute) = @_;
+ $attribute->attach_to_class($self);
}
# It'd be nice if I didn't have to replicate this for class
return $inherited_attr->clone_and_inherit_options(%p);
}
-sub remove_class_attribute {
+around remove_class_attribute => sub {
+ my $orig = shift;
my $self = shift;
- my $name = shift;
-
- ( defined $name && $name )
- || confess 'You must provide an attribute name';
- my $removed_attr = $self->get_class_attribute($name);
- return unless $removed_attr;
-
- $self->_remove_class_attribute($name);
+ my $removed_attr = $self->$orig(@_)
+ or return;
$removed_attr->remove_accessors();
$removed_attr->detach_from_class();
return $removed_attr;
-}
+};
sub get_all_class_attributes {
my $self = shift;