if (@_) {
foreach my $super(@_){
Mouse::Util::load_class($super);
- my $meta = Mouse::Util::get_metaclass_by_name($super);
- next if not defined $meta;
+ my $meta = Mouse::Util::get_metaclass_by_name($super);
+ unless(defined $meta) {
+ # checks if $super is a foreign class (i.e. non-Mouse class)
+ my $mm = $super->can('meta');
+ if(!($mm && $mm == \&Mouse::Util::meta)) {
+ if($super->can('new') or $super->can('DESTROY')) {
+ $self->inherit_from_foreign_class($super);
+ }
+ }
+ next;
+ }
if(Mouse::Util::is_a_metarole($meta)){
$self->throw_error("You cannot inherit from a Mouse Role ($super)");
}
+ # checks and fixes in metaclass compatiility
next if $self->isa(ref $meta); # _superclass_meta_is_compatible
-
$self->_reconcile_with_superclass_meta($meta);
}
@{ $self->{superclasses} } = @_;
return @{ $self->{superclasses} };
}
+
+sub inherit_from_foreign_class {
+ my($class, $super) = @_;
+ Carp::carp("You inherit from non-Mouse class ($super),"
+ . " but it is unlikely to work correctly."
+ . " Please concider to use MouseX::Foreign");
+ return;
+}
+
my @MetaClassTypes = (
'attribute', # Mouse::Meta::Attribute
'method', # Mouse::Meta::Method
my $modifier_table = $self->{modifiers}{$name};
if(!$modifier_table){
- my(@before, @after, $cache);
-
- $cache = $original;
-
- my $around_only = ($type eq 'around');
-
+ my(@before, @after, @around);
+ my $cache = $original;
my $modified = sub {
- if($around_only) {
+ if(@before) {
+ for my $c (@before) { $c->(@_) }
+ }
+ unless(@after) {
return $cache->(@_);
}
- for my $c (@before) { $c->(@_) }
-
if(wantarray){ # list context
my @rval = $cache->(@_);
before => \@before,
after => \@after,
- around => \my @around,
- around_only => \$around_only,
+ around => \@around,
cache => \$cache, # cache for around modifiers
};
}
if($type eq 'before'){
- ${$modifier_table->{around_only}} = 0;
unshift @{$modifier_table->{before}}, $code;
}
elsif($type eq 'after'){
- ${$modifier_table->{around_only}} = 0;
push @{$modifier_table->{after}}, $code;
}
else{ # around
=head1 VERSION
-This document describes Mouse version 0.67
+This document describes Mouse version 0.70
+
+=head1 DESCRIPTION
+
+This class is a meta object protocol for Mouse classes,
+which is a subset of Moose::Meta:::Class.
=head1 METHODS