X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FAction.pm;h=257feb5870eb524bbed298fcf6f45bc537584dd1;hp=d5f15021ca893bbf269debbe2cbb4ba19e90c437;hb=a521afccf18e9a7ad0f19cbcdcf199ac033280d6;hpb=59051400675390bde280ae6dc6cf500c7bd340cf diff --git a/lib/Catalyst/Action.pm b/lib/Catalyst/Action.pm index d5f1502..257feb5 100644 --- a/lib/Catalyst/Action.pm +++ b/lib/Catalyst/Action.pm @@ -260,27 +260,36 @@ sub resolve_type_constraint { # and superclasses, look for attributes and figure it out. # Superclasses take precedence; # - my @supers = map { $_->meta } $self->class->meta->superclasses; - my @roles = $self->class->meta->calculate_all_roles; + my @supers = $self->class->can('meta') ? map { $_->meta } $self->class->meta->superclasses : (); + my @roles = $self->class->can('meta') ? $self->class->meta->calculate_all_roles : (); # So look thru all the super and roles in order and return the # first type constraint found. We should probably find all matching # type constraints and try to do some sort of resolution. + + warn "--> Hunting for TC $name in controller hierarchy\n" if $ENV{CATALYST_CONSTRAINTS_DEBUG}; foreach my $parent (@roles, @supers) { + warn " Looking for TC $name in ${\$parent->name}\n" if $ENV{CATALYST_CONSTRAINTS_DEBUG}; if(my $m = $parent->get_method($self->name)) { if($m->can('attributes')) { + warn " method $m has attributes\n" if $ENV{CATALYST_CONSTRAINTS_DEBUG}; my ($key, $value) = map { $_ =~ /^(.*?)(?:\(\s*(.+?)\s*\))?$/ } grep { $_=~/^Args\(/ or $_=~/^CaptureArgs\(/ } @{$m->attributes}; + warn " about to evaluate any found attrs\n" if $ENV{CATALYST_CONSTRAINTS_DEBUG}; next unless $value eq $name; + warn " found attr info $key and $value\n" if $ENV{CATALYST_CONSTRAINTS_DEBUG}; my @tc = eval "package ${\$parent->name}; $name"; - return @tc if @tc; + return @tc if scalar(@tc); + } else { + warn " method $m does not have method attributes\n" if $ENV{CATALYST_CONSTRAINTS_DEBUG}; } } } - - die "'$name' not a type constraint in ${\$self->private_path}"; + + my $classes = join(',', $self->class, @roles, @supers); + die "'$name' not a type constraint in '${\$self->private_path}', Looked in: $classes"; }; if($tc[0]) {