however if your targeted action or action chain has the Scheme attribute it will
use that instead.
+Also, if the targeted Action or Action chain declares Args/CaptureArgs that have
+type constraints, we will require that your proposed URL verify on those declared
+constraints.
+
=cut
sub uri_for {
foreach my $arg (@args) {
if(ref($arg)||'' eq 'ARRAY') {
push @encoded_args, [map {
- my $encoded = encode_utf8 $_;
- $encoded =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
- $encoded;
+ # my $encoded = encode_utf8 $_;
+ # $encoded =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
+ # $encoded;
+ $_
} @$arg];
} else {
push @encoded_args, do {
- my $encoded = encode_utf8 $arg;
- $encoded =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
- $encoded;
+ # my $encoded = encode_utf8 $arg;
+ # $encoded =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
+ # $encoded;
+ $arg;
}
}
}
: ()) ];
my $action = $path;
+ my $expanded_action = $c->dispatcher->expand_action( $action );
+ my $num_captures = $expanded_action->number_of_captures;
+
# ->uri_for( $action, \@captures_and_args, \%query_values? )
if( !@encoded_args && $action->number_of_args ) {
- my $expanded_action = $c->dispatcher->expand_action( $action );
- my $num_captures = $expanded_action->number_of_captures;
- unshift @encoded_args, splice @$captures, $num_captures;
+ unshift @encoded_args, splice @$captures, $num_captures;
}
- # use Devel::Dwarn;Dwarn $captures;
-
- if($action->has_captures_constraints) {
- unless($action->match_captures($c, $captures)) {
- carp "@{$captures} do not match the type constraints in $action";
+ if($num_captures) {
+ unless($expanded_action->match_captures($c, $captures)) {
+ carp "captures [@{$captures}] do not match the type constraints in actionchain ending with '$action'";
+ return;
}
}
$path = '/' if $path eq '';
# At this point @encoded_args is the remaining Args (all captures removed).
- if($action->has_args_constraints) {
- unless($action->match_args($c,\@encoded_args)) {
- carp "@encoded_args do not match the type constraints in $action";
+ if($expanded_action->has_args_constraints) {
+ unless($expanded_action->match_args($c,\@encoded_args)) {
+ carp "args [@encoded_args] do not match the type constraints in action '$expanded_action'";
+ return;
}
}
}
} @keys);
}
- warn $base;
- warn $args;
+ $base = encode_utf8 $base;
+ $base =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
+ $args = encode_utf8 $args;
+ $args =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
my $res = bless(\"${base}${args}${query}", $class);
$res;