Catalyst-Runtime
view release on metacpan or search on metacpan
lib/Catalyst/DispatchType/Chained.pm view on Meta::CPAN
my $names = join '/', map { "{$_}" } $curr->all_captures_constraints;
unshift(@parts, $names);
} else {
unshift(@parts, (("*") x $cap));
}
}
if (my $pp = $curr->attributes->{PathPart}) {
unshift(@parts, $pp->[0])
if (defined $pp->[0] && length $pp->[0]);
}
$parent = $curr->attributes->{Chained}->[0];
$curr = $self->_actions->{$parent};
unshift(@parents, $curr) if $curr;
}
if ($parent ne '/') {
$has_unattached_actions = 1;
$unattached_actions->row('/' . ($parents[0] || $endpoint)->reverse, $parent);
next ENDPOINT;
}
my @rows;
foreach my $p (@parents) {
my $name = "/${p}";
if (defined(my $extra = $self->_list_extra_http_methods($p))) {
$name = "${extra} ${name}";
}
if (defined(my $cap = $p->list_extra_info->{CaptureArgs})) {
if($p->has_captures_constraints) {
my $tc = join ',', @{$p->captures_constraints};
$name .= " ($tc)";
} else {
$name .= " ($cap)";
}
}
if (defined(my $ct = $p->list_extra_info->{Consumes})) {
$name .= ' :'.$ct;
}
if (defined(my $s = $p->list_extra_info->{Scheme})) {
$scheme = uc $s;
}
unless ($p eq $parents[0]) {
$name = "-> ${name}";
}
push(@rows, [ '', $name ]);
}
my $endpoint_arg_info = $endpoint;
if($endpoint->has_args_constraints) {
my $tc = join ',', @{$endpoint->args_constraints};
$endpoint_arg_info .= " ($tc)";
} else {
$endpoint_arg_info .= defined($endpoint->attributes->{Args}[0]) ? " ($args)" : " (...)";
}
push(@rows, [ '', (@rows ? "=> " : '').($extra ? "$extra " : ''). ($scheme ? "$scheme: ":'')."/${endpoint_arg_info}". ($consumes ? " :$consumes":"" ) ]);
my @display_parts = map { $_ =~s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; decode_utf8 $_ } @parts;
$rows[0][0] = join('/', '', @display_parts) || '/';
$paths->row(@$_) for @rows;
}
$c->log->debug( "Loaded Chained actions:\n" . $paths->draw . "\n" );
$c->log->debug( "Unattached Chained actions:\n", $unattached_actions->draw . "\n" )
if $has_unattached_actions;
}
sub _list_extra_http_methods {
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}});
}
sub _list_extra_scheme {
my ( $self, $action ) = @_;
return unless defined $action->list_extra_info->{Scheme};
return uc $action->list_extra_info->{Scheme};
}
=head2 $self->match( $c, $path )
Calls C<recurse_match> to see if a chain matches the C<$path>.
=cut
sub match {
my ( $self, $c, $path ) = @_;
my $request = $c->request;
return 0 if @{$request->args};
my @parts = split('/', $path);
my ($chain, $captures, $parts) = $self->recurse_match($c, '/', \@parts);
if ($parts && @$parts) {
for my $arg (@$parts) {
$arg =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
push @{$request->args}, $arg;
}
}
return 0 unless $chain;
my $action = Catalyst::ActionChain->from_chain($chain);
$request->action("/${action}");
$request->match("/${action}");
$request->captures($captures);
$c->action($action);
$c->namespace( $action->namespace );
return 1;
}
=head2 $self->recurse_match( $c, $parent, \@path_parts )
( run in 0.647 second using v1.01-cache-2.11-cpan-39bf76dae61 )