sub method_metaclass() { 'Mouse::Meta::Method' }
sub attribute_metaclass() { 'Mouse::Meta::Attribute' }
+sub constructor_class() { 'Mouse::Meta::Method::Constructor' }
+sub destructor_class() { 'Mouse::Meta::Method::Destructor' }
+
sub _construct_meta {
my($class, %args) = @_;
my $self = shift;
if (@_) {
- Mouse::load_class($_) for @_;
+ foreach my $super(@_){
+ Mouse::Util::load_class($super);
+ my $meta = Mouse::Util::get_metaclass_by_name($super);
+ if($meta && $meta->isa('Mouse::Meta::Role')){
+ $self->throw_error("You cannot inherit from a Mouse Role ($super)");
+ }
+ }
@{ $self->{superclasses} } = @_;
}
$self->{is_immutable}++;
if ($args{inline_constructor}) {
- # generate and install
- Mouse::Meta::Method::Constructor->_generate_constructor_method($self, \%args);
+ $self->add_method($args{constructor_name} =>
+ $self->constructor_class->_generate_constructor($self, \%args));
}
if ($args{inline_destructor}) {
- # generate and install
- Mouse::Meta::Method::Destructor->_generate_destructor_method($self, \%args);
+ $self->add_method(DESTROY =>
+ $self->destructor_class->_generate_destructor($self, \%args));
}
# Moose's make_immutable returns true allowing calling code to skip setting an explicit true value
sub is_mutable { !$_[0]->{is_immutable} }
sub _install_modifier_pp{
- my( $self, $into, $type, $name, $code ) = @_;
+ my( $self, $type, $name, $code ) = @_;
+ my $into = $self->name;
my $original = $into->can($name)
or $self->throw_error("The method '$name' is not found in the inheritance hierarchy for class $into");
}
sub _install_modifier {
- my ( $self, $into, $type, $name, $code ) = @_;
+ my ( $self, $type, $name, $code ) = @_;
# load Class::Method::Modifiers first
my $no_cmm_fast = do{
else{
my $install_modifier = Class::Method::Modifiers::Fast->can('_install_modifier');
$impl = sub {
- my ( $self, $into, $type, $name, $code ) = @_;
- $install_modifier->(
- $into,
- $type,
- $name,
- $code
- );
- $self->{methods}{$name}++; # register it to the method map
+ my ( $self, $type, $name, $code ) = @_;
+ my $into = $self->name;
+ $install_modifier->($into, $type, $name, $code);
+
+ $self->add_method($name => do{
+ no strict 'refs';
+ \&{ $into . '::' . $name };
+ });
return;
};
}
*_install_modifier = $impl;
}
- $self->$impl( $into, $type, $name, $code );
+ $self->$impl( $type, $name, $code );
}
sub add_before_method_modifier {
my ( $self, $name, $code ) = @_;
- $self->_install_modifier( $self->name, 'before', $name, $code );
+ $self->_install_modifier( 'before', $name, $code );
}
sub add_around_method_modifier {
my ( $self, $name, $code ) = @_;
- $self->_install_modifier( $self->name, 'around', $name, $code );
+ $self->_install_modifier( 'around', $name, $code );
}
sub add_after_method_modifier {
my ( $self, $name, $code ) = @_;
- $self->_install_modifier( $self->name, 'after', $name, $code );
+ $self->_install_modifier( 'after', $name, $code );
}
sub add_override_method_modifier {
|| $self->throw_error("You must supply a role name to look for");
for my $class ($self->linearized_isa) {
- my $meta = Mouse::Util::get_metaclass_by_name($class);
- next unless $meta && $meta->can('roles');
+ my $meta = Mouse::Util::get_metaclass_by_name($class)
+ or next;
for my $role (@{ $meta->roles }) {
}
1;
-
__END__
=head1 NAME