Catalyst-Plugin-CachedUriForAction
view release on metacpan or search on metacpan
lib/Catalyst/Plugin/CachedUriForAction.pm view on Meta::CPAN
# the following is carefully written to
# - loop over every input array exactly once
# - avoid any conditionals inside each loop body
# - use only simple loop forms that are specially optimised by the perl interpreter
my $i = -1;
if ( defined $n_args ) { # the non-slurpy case
Carp::croak "Wrong number of args+captures for path '$action' (need ".@$extra_parts.") in uri_for_action"
if ( @$captures + @_ ) != @$extra_parts;
# and now since @$extra_parts is exactly the same length as @$captures and @_ combined
# iterate over those arrays and use a cursor into @$extra_parts to interleave its elements
for ( @$captures ) { ( $uri .= uri_encode_utf8 $_ ) .= $extra_parts->[ ++$i ] }
for ( @_ ) { ( $uri .= uri_encode_utf8 $_ ) .= $extra_parts->[ ++$i ] }
} else {
# in the slurpy case, the size of @$extra_parts is determined by $n_caps alone since $n_args was undef
# and as we checked above @$captures alone has at least length $n_caps
# so we will need all of @$captures to cover @$extra_parts, and may then still have some of it left over
# so iterate over @$extra_parts and use a cursor into @$captures to interleave its elements
for ( @$extra_parts ) { ( $uri .= uri_encode_utf8 $captures->[ ++$i ] ) .= $_ }
# and then append the rest of @$captures, and then everything from @_ after that
for ( ++$i .. $#$captures ) { ( $uri .= '/' ) .= uri_encode_utf8 $captures->[ $_ ] }
for ( @_ ) { ( $uri .= '/' ) .= uri_encode_utf8 $_ }
}
$uri =~ s/%2B/+/g;
substr $uri, 0, 0, $$base;
if ( defined $params ) {
( run in 0.219 second using v1.01-cache-2.11-cpan-4d50c553e7e )