my @parents = ();
my $parent = "DUMMY";
my $extra = $self->_list_extra_http_methods($endpoint);
+ my $consumes = $self->_list_extra_consumes($endpoint);
my $curr = $endpoint;
while ($curr) {
if (my $cap = $curr->list_extra_info->{CaptureArgs}) {
if (defined(my $cap = $p->list_extra_info->{CaptureArgs})) {
$name .= ' ('.$cap.')';
}
+ if (defined(my $ct = $p->list_extra_info->{Consumes})) {
+ $name .= ' :'.$ct;
+ }
+
unless ($p eq $parents[0]) {
$name = "-> ${name}";
}
push(@rows, [ '', $name ]);
}
- push(@rows, [ '', (@rows ? "=> " : '').($extra ? "$extra " : '')."/${endpoint}" ]);
+ push(@rows, [ '', (@rows ? "=> " : '').($extra ? "$extra " : '')."/${endpoint}". ($consumes ? " :$consumes":"" ) ]);
$rows[0][0] = join('/', '', @parts) || '/';
$paths->row(@$_) for @rows;
}
my ( $self, $action ) = @_;
return unless defined $action->list_extra_info->{HTTP_METHODS};
return join(', ', @{$action->list_extra_info->{HTTP_METHODS}});
+
+}
+
+sub _list_extra_consumes {
+ my ( $self, $action ) = @_;
+ return unless defined $action->list_extra_info->{CONSUMES};
+ return join(', ', @{$action->list_extra_info->{CONSUMES}});
}
+
=head2 $self->match( $c, $path )
Calls C<recurse_match> to see if a chain matches the C<$path>.
my @try_actions = @{$children->{$try_part}};
TRY_ACTION: foreach my $action (@try_actions) {
if (my $capture_attr = $action->attributes->{CaptureArgs}) {
- $capture_attr ||= 0;
+ my $capture_count = $capture_attr->[0] || 0;
# Short-circuit if not enough remaining parts
- next TRY_ACTION unless @parts >= $capture_attr->[0];
+ next TRY_ACTION unless @parts >= $capture_count;
my @captures;
my @parts = @parts; # localise
# strip CaptureArgs into list
- push(@captures, splice(@parts, 0, $capture_attr->[0]));
+ push(@captures, splice(@parts, 0, $capture_count));
# 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) }
=cut
+sub _check_args_attr {
+ my ( $self, $action, $name ) = @_;
+
+ return unless exists $action->attributes->{$name};
+
+ if (@{$action->attributes->{$name}} > 1) {
+ Catalyst::Exception->throw(
+ "Multiple $name attributes not supported registering " . $action->reverse()
+ );
+ }
+ my $args = $action->attributes->{$name}->[0];
+ if (defined($args) and not (
+ Scalar::Util::looks_like_number($args) and
+ int($args) == $args and $args >= 0
+ )) {
+ require Data::Dumper;
+ local $Data::Dumper::Terse = 1;
+ local $Data::Dumper::Indent = 0;
+ $args = Data::Dumper::Dumper($args);
+ Catalyst::Exception->throw(
+ "Invalid $name($args) for action " . $action->reverse() .
+ " (use '$name' or '$name(<number>)')"
+ );
+ }
+}
+
sub register {
my ( $self, $c, $action ) = @_;
$self->_actions->{'/'.$action->reverse} = $action;
- if (exists $action->attributes->{Args}) {
- my $args = $action->attributes->{Args}->[0];
- if (defined($args) and not (
- Scalar::Util::looks_like_number($args) and
- int($args) == $args
- )) {
- require Data::Dumper;
- local $Data::Dumper::Terse = 1;
- local $Data::Dumper::Indent = 0;
- $args = Data::Dumper::Dumper($args);
- Catalyst::Exception->throw(
- "Invalid Args($args) for action " . $action->reverse() .
- " (use 'Args' or 'Args(<number>)'"
- );
- }
+ foreach my $name (qw(Args CaptureArgs)) {
+ $self->_check_args_attr($action, $name);
+ }
+
+ if (exists $action->attributes->{Args} and exists $action->attributes->{CaptureArgs}) {
+ Catalyst::Exception->throw(
+ "Combining Args and CaptureArgs attributes not supported registering " .
+ $action->reverse()
+ );
}
unless ($action->attributes->{CaptureArgs}) {
C<auto> actions will be run before the chain dispatching begins. In
every other aspect, C<auto> actions behave as documented.
-The C<forward>ing to other actions does just what you would expect. ie
+The C<forward>ing to other actions does just what you would expect. i.e.
only the target action is run. The actions that that action is chained
to are not run.
If you C<detach> out of a chain, the rest of the chain will not get