}
my @try_actions = @{$children->{$try_part}};
TRY_ACTION: foreach my $action (@try_actions) {
+
+
if (my $capture_attr = $action->attributes->{CaptureArgs}) {
my $capture_count = $action->number_of_captures|| 0;
next TRY_ACTION unless $action->match($c);
}
my $args_attr = $action->attributes->{Args}->[0];
+ my $args_count = $action->normalized_arg_number;
my @pathparts = split /\//, $action->attributes->{PathPart}->[0];
# No best action currently
# OR This one matches with fewer parts left than the current best action,
# OR No parts and this expects 0
# The current best action might also be Args(0),
# but we couldn't chose between then anyway so we'll take the last seen
-
if (
!$best_action ||
@parts < @{$best_action->{parts}} ||
!@parts &&
defined($args_attr) &&
(
- $args_attr eq "0" &&
+ $args_count eq "0" &&
(
($c->config->{use_chained_args_0_special_case}||0) ||
(
- exists($best_action->{args_attr}) && defined($best_action->{args_attr}) ?
- ($best_action->{args_attr} ne 0) : 1
+ exists($best_action->{args_count}) && defined($best_action->{args_count}) ?
+ ($best_action->{args_count} ne 0) : 1
)
)
)
actions => [ $action ],
captures=> [],
parts => \@parts,
- args_attr => $args_attr,
+ args_count => $args_count,
n_pathparts => scalar(@pathparts),
};
}
sub int_priority_chain :Chained(chain_base) PathPart('') Args(Int) { }
+If you use a reference type constraint in CaptureArgs, it must be a type
+like Tuple in L<Types::Standard> that allows us to determine the number of
+args to match. Otherwise this will raise an error during startup.
+
See L<Catalyst::RouteMatching> for more.
=item Args
C<@_> after the context object. They can also be reached through
C<$c-E<gt>request-E<gt>arguments>.
+You should see 'Args' in L<Catalyst::Controller> for more details on using
+type constraints in your Args declarations.
+
=back
=head2 Auto actions, dispatching and forwarding