};
my $self = bless \%args, ref($class) || $class;
- if($class ne __PACKAGE__){
+ if(ref($self) ne __PACKAGE__){
$self->meta->_initialize_object($self, \%args);
}
return $self;
if ($name =~ s/^\+//) { # inherited attributes
my $inherited_attr;
+ # find_attribute_by_name
foreach my $class($self->linearized_isa){
my $meta = Mouse::Util::get_metaclass_by_name($class) or next;
$inherited_attr = $meta->get_attribute($name) and last;
defined($inherited_attr)
or $self->throw_error("Could not find an attribute by the name of '$name' to inherit from in ".$self->name);
- $attr = $inherited_attr->clone_and_inherit_options($name, \%args);
+ $attr = $inherited_attr->clone_and_inherit_options(%args);
}
else{
- my($attribute_class, @traits) = $self->attribute_metaclass->interpolate_class($name, \%args);
+ my($attribute_class, @traits) = $self->attribute_metaclass->interpolate_class(\%args);
$args{traits} = \@traits if @traits;
$attr = $attribute_class->new($name, %args);
sub add_override_method_modifier {
my ($self, $name, $code) = @_;
+ if($self->has_method($name)){
+ $self->throw_error("Cannot add an override method if a local method is already present");
+ }
+
my $package = $self->name;
- my $body = $package->can($name)
+ my $super_body = $package->can($name)
or $self->throw_error("You cannot override '$name' because it has no super method");
- $self->add_method($name => sub { $code->($package, $body, @_) });
+ $self->add_method($name => sub {
+ local $Mouse::SUPER_PACKAGE = $package;
+ local $Mouse::SUPER_BODY = $super_body;
+ local @Mouse::SUPER_ARGS = @_;
+
+ $code->(@_);
+ });
+ return;
+}
+
+sub add_augment_method_modifier {
+ my ($self, $name, $code) = @_;
+ if($self->has_method($name)){
+ $self->throw_error("Cannot add an augment method if a local method is already present");
+ }
+
+ my $super = $self->find_method_by_name($name)
+ or $self->throw_error("You cannot augment '$name' because it has no super method");
+
+ my $super_package = $super->package_name;
+ my $super_body = $super->body;
+
+ $self->add_method($name => sub{
+ local $Mouse::INNER_BODY{$super_package} = $code;
+ local $Mouse::INNER_ARGS{$super_package} = [@_];
+ $super_body->(@_);
+ });
+ return;
}
sub does_role {