return unless $self->_endpoints;
- my $column_width = Catalyst::Utils::term_width() - 35 - 9;
+ my $avail_width = Catalyst::Utils::term_width() - 9;
+ my $col1_width = ($avail_width * .50) < 35 ? 35 : int($avail_width * .50);
+ my $col2_width = $avail_width - $col1_width;
my $paths = Text::SimpleTable->new(
- [ 35, 'Path Spec' ], [ $column_width, 'Private' ],
+ [ $col1_width, 'Path Spec' ], [ $col2_width, 'Private' ],
);
my $has_unattached_actions;
my $unattached_actions = Text::SimpleTable->new(
- [ 35, 'Private' ], [ $column_width, 'Missing parent' ],
+ [ $col1_width, 'Private' ], [ $col2_width, 'Missing parent' ],
);
ENDPOINT: foreach my $endpoint (
if (my $cap = $curr->attributes->{CaptureArgs}) {
unshift(@parts, (("*") x $cap->[0]));
}
- if (my $pp = $curr->attributes->{PartPath}) {
+ if (my $pp = $curr->attributes->{PathPart}) {
unshift(@parts, $pp->[0])
if (defined $pp->[0] && length $pp->[0]);
}
if (my $capture_attr = $action->attributes->{CaptureArgs}) {
# Short-circuit if not enough remaining parts
- next TRY_ACTION unless @parts >= $capture_attr->[0];
+ next TRY_ACTION unless @parts >= ($capture_attr->[0]||0);
my @captures;
my @parts = @parts; # localise
# strip CaptureArgs into list
push(@captures, splice(@parts, 0, $capture_attr->[0]));
+ # check if the action may fit, depending on a given test by the app
+ if ($action->can('match_captures')) { next TRY_ACTION unless $action->match_captures($c, \@captures) }
+
# try the remaining parts against children of this action
- my ($actions, $captures, $action_parts) = $self->recurse_match(
+ my ($actions, $captures, $action_parts, $n_pathparts) = $self->recurse_match(
$c, '/'.$action->reverse, \@parts
);
# No best action currently
(!$best_action ||
$#$action_parts < $#{$best_action->{parts}} ||
($#$action_parts == $#{$best_action->{parts}} &&
- $#$captures < $#{$best_action->{captures}}))){
+ $#$captures < $#{$best_action->{captures}} &&
+ $n_pathparts > $best_action->{n_pathparts}))) {
+ my @pathparts = split /\//, $action->attributes->{PathPart}->[0];
$best_action = {
actions => [ $action, @$actions ],
captures=> [ @captures, @$captures ],
- parts => $action_parts
- };
+ parts => $action_parts,
+ n_pathparts => scalar(@pathparts) + $n_pathparts,
+ };
}
}
else {
local $c->req->{arguments} = [ @{$c->req->args}, @parts ];
next TRY_ACTION unless $action->match($c);
}
-
- # Default args is blank, not 0, since Args()
my $args_attr = $action->attributes->{Args}->[0];
- $args_attr = '' unless defined $args_attr;
-
+ my @pathparts = split /\//, $action->attributes->{PathPart}->[0];
# No best action currently
# OR This one matches with fewer parts left than the current best action,
# And therefore is a better match
$best_action = {
actions => [ $action ],
captures=> [],
- parts => \@parts
- }
+ parts => \@parts,
+ n_pathparts => scalar(@pathparts),
+ };
}
}
}
}
- return @$best_action{qw/actions captures parts/} if $best_action;
+ return @$best_action{qw/actions captures parts n_pathparts/} if $best_action;
return ();
}
);
}
- $action->attributes->{PartPath} = [ $part ];
+ $action->attributes->{PathPart} = [ $part ];
unshift(@{ $children->{$part} ||= [] }, $action);
unshift(@parts, splice(@captures, -$cap->[0]));
}
}
- if (my $pp = $curr->attributes->{PartPath}) {
+ if (my $pp = $curr->attributes->{PathPart}) {
unshift(@parts, $pp->[0])
if (defined($pp->[0]) && length($pp->[0]));
}
}
__PACKAGE__->meta->make_immutable;
+1;
=head1 USAGE
you C<detach> out of a chain, the rest of the chain will not get called
after the C<detach>.
+=head2 match_captures
+
+A method which can optionally be implemented by actions to
+stop chain matching.
+
+See L<Catalyst::Action> for further details.
+
=head1 AUTHORS
Catalyst Contributors, see Catalyst.pm