X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst.pm;h=b655be30654d838644e6c6d79bc49e39ff0e9407;hp=34fd2d062d45c0d66c83c2f1c87aeee8c81cabd4;hb=28928de92c8bfea34d7e995bc92f1bf5632242d6;hpb=3b88a4556575f18382261e47214bb281694d8f16 diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 34fd2d0..b655be3 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -22,6 +22,8 @@ use Scalar::Util qw/weaken blessed/; use Tree::Simple qw/use_weak_refs/; use Tree::Simple::Visitor::FindByUID; use attributes; +use utf8; +use Carp qw/croak/; __PACKAGE__->mk_accessors( qw/counter request response state action stack namespace/ @@ -298,6 +300,7 @@ sub error { my $c = shift; if ( $_[0] ) { my $error = ref $_[0] eq 'ARRAY' ? $_[0] : [@_]; + croak @$error unless ref $c; push @{ $c->{error} }, @$error; } elsif ( defined $_[0] ) { $c->{error} = undef } @@ -852,6 +855,14 @@ sub uri_for { my $params = ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} ); + for my $value ( values %$params ) { + my $isa_ref = ref $value; + if( $isa_ref and $isa_ref ne 'ARRAY' ) { + croak( "Non-array reference ($isa_ref) passed to uri_for()" ); + } + utf8::encode( $_ ) for $isa_ref ? @$value : $value; + }; + # join args with '/', or a blank string my $args = ( scalar @args ? '/' . join( '/', @args ) : '' ); $args =~ s/^\/// unless $path; @@ -1187,6 +1198,23 @@ sub execute { return $c->state; } +=head2 $c->_localize_fields( sub { }, \%keys ); + +=cut + +sub _localize_fields { + my ( $c, $localized, $code ) = ( @_ ); + + my $request = delete $localized->{request} || {}; + my $response = delete $localized->{response} || {}; + + local @{ $c }{ keys %$localized } = values %$localized; + local @{ $c->request }{ keys %$request } = values %$request; + local @{ $c->response }{ keys %$response } = values %$response; + + $code->(); +} + =head2 $c->finalize Finalizes the request.