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} } = @_;
}
my($self, $method_name) = @_;
defined($method_name)
or $self->throw_error('You must define a method name to find');
+
foreach my $class( $self->linearized_isa ){
my $method = $self->initialize($class)->get_method($method_name);
return $method if defined $method;
}
sub compute_all_applicable_attributes {
- Carp::cluck('compute_all_applicable_attributes() has been deprecated');
+ Carp::cluck('compute_all_applicable_attributes() has been deprecated')
+ if _MOUSE_VERBOSE;
return shift->get_all_attributes(@_)
}
my $key = $attribute->name;
if (defined($from) && exists($args->{$from})) {
- $object->{$key} = $attribute->_coerce_and_verify($args->{$from});
+ $object->{$key} = $attribute->_coerce_and_verify($args->{$from}, $object);
weaken($object->{$key})
if ref($object->{$key}) && $attribute->is_weak_ref;
: ref($default) eq 'CODE' ? $object->$default()
: $default;
- # XXX: we cannot use $attribute->set_value() because it invokes triggers.
- $object->{$key} = $attribute->_coerce_and_verify($value, $object);;
+ $object->{$key} = $attribute->_coerce_and_verify($value, $object);
weaken($object->{$key})
if ref($object->{$key}) && $attribute->is_weak_ref;
$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
Mouse::Meta::Class - The Mouse class metaclass
+=head1 VERSION
+
+This document describes Mouse version 0.37_06
+
=head1 METHODS
=head2 C<< initialize(ClassName) -> Mouse::Meta::Class >>