summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2010-06-15 03:23:51 -0500
committerJesse Luehrs <doy@tozt.net>2010-06-15 03:23:51 -0500
commit100db48d71485b89247a454a043dc409aa3af505 (patch)
tree7c8cbdb7349c1aeab9fc3a9a73b8e31cfb631daa /lib
parent93eab51bc542fed536c8b0a51a4ee3dbf82b53f4 (diff)
downloadmoosex-nonmoose-100db48d71485b89247a454a043dc409aa3af505.tar.gz
moosex-nonmoose-100db48d71485b89247a454a043dc409aa3af505.zip
find the nearest non-moose constructor, not just any constructor
Diffstat (limited to 'lib')
-rw-r--r--lib/MooseX/NonMoose/Meta/Role/Constructor.pm17
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/MooseX/NonMoose/Meta/Role/Constructor.pm b/lib/MooseX/NonMoose/Meta/Role/Constructor.pm
index 4b3ee82..4650200 100644
--- a/lib/MooseX/NonMoose/Meta/Role/Constructor.pm
+++ b/lib/MooseX/NonMoose/Meta/Role/Constructor.pm
@@ -46,12 +46,25 @@ around can_be_inlined => sub {
return $self->$orig(@_);
};
+sub _find_next_nonmoose_constructor_package {
+ my $self = shift;
+ my $new = $self->name;
+ my $meta = $self->associated_metaclass;
+ for my $method (map { $_->{code} } $meta->find_all_methods_by_name($new)) {
+ next if $method->associated_metaclass->meta->can('does_role')
+ && $method->associated_metaclass->meta->does_role('MooseX::NonMoose::Meta::Role::Class');
+ return $method->package_name;
+ }
+ # this should never happen (it should find Moose::Object at least)
+ $meta->throw_error("Couldn't find a non-Moose constructor for " . $meta->name);
+}
+
sub _generate_fallback_constructor {
my $self = shift;
my ($class_var) = @_;
my $new = $self->name;
my $meta = $self->associated_metaclass;
- my $super_new_class = $meta->find_next_method_by_name($new)->package_name;
+ my $super_new_class = $self->_find_next_nonmoose_constructor_package;
my $arglist = $meta->get_method('FOREIGNBUILDARGS')
? "${class_var}->FOREIGNBUILDARGS(\@_)"
: '@_';
@@ -64,7 +77,7 @@ sub _generate_instance {
my ($var, $class_var) = @_;
my $new = $self->name;
my $meta = $self->associated_metaclass;
- my $super_new_class = $meta->find_next_method_by_name($new)->package_name;
+ my $super_new_class = $self->_find_next_nonmoose_constructor_package;
my $arglist = $meta->get_method('FOREIGNBUILDARGS')
? "${class_var}->FOREIGNBUILDARGS(\@_)"
: '@_';