Fixed a small bug
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
index 34fd2d0..b655be3 100644 (file)
@@ -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 ) {\r
+        my $isa_ref = ref $value;\r
+        if( $isa_ref and $isa_ref ne 'ARRAY' ) {\r
+            croak( "Non-array reference ($isa_ref) passed to uri_for()" );\r
+        }\r
+        utf8::encode( $_ ) for $isa_ref ? @$value : $value;\r
+    };
+    
     # 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.