Improve error messages for forward/detach/visit/go. Patch by batman++
Florian Ragwitz [Tue, 7 Oct 2008 22:41:34 +0000 (22:41 +0000)]
lib/Catalyst/Dispatcher.pm

index 69068fb..575b1a6 100644 (file)
@@ -84,18 +84,6 @@ it with a C<+>, like so:
 
     +My::Dispatch::Type
 
-=head2 $self->detach( $c, $command [, \@arguments ] )
-
-Documented in L<Catalyst>
-
-=cut
-
-sub detach {
-    my ( $self, $c, $command, @args ) = @_;
-    $c->forward( $command, @args ) if $command;
-    die $Catalyst::DETACH;
-}
-
 =head2 $self->dispatch($c)
 
 Delegate the dispatch to the action that matched the url, or return a
@@ -177,7 +165,8 @@ sub _do_visit {
     my $error = qq/Couldn't $opname("$command"): /;
 
     if (!$action) {
-        $error .= qq/Invalid action or component./;
+        $error .= qq/Couldn't $opname to command "$command": /
+                 .qq/Invalid action or component./;
     }
     elsif (!defined $action->namespace) {
         $error .= qq/Action has no namespace: cannot $opname() to a plain /
@@ -226,30 +215,45 @@ Documented in L<Catalyst>
 
 sub forward {
     my $self = shift;
+    $self->_do_forward(forward => @_);
+}
+
+sub _do_forward {
+    my $self = shift;
+    my $opname = shift;
     my ( $c, $command ) = @_;
     my ( $action, $args ) = $self->_command2action(@_);
 
-    unless ($action) {
-        my $error =
-            qq/Couldn't forward to command "$command": /
-          . qq/Invalid action or component./;
+    if (!$action) {
+        my $error .= qq/Couldn't $opname to command "$command": /
+                    .qq/Invalid action or component./;
         $c->error($error);
         $c->log->debug($error) if $c->debug;
         return 0;
     }
 
-    #push @$args, @_;
-
     no warnings 'recursion';
 
     my $orig_args = $c->request->arguments();
     $c->request->arguments($args);
     $action->dispatch( $c );
     $c->request->arguments($orig_args);
-    
+
     return $c->state;
 }
 
+=head2 $self->detach( $c, $command [, \@arguments ] )
+
+Documented in L<Catalyst>
+
+=cut
+
+sub detach {
+    my ( $self, $c, $command, @args ) = @_;
+    $self->_do_forward(detach => $c, $command, @args ) if $command;
+    die $Catalyst::DETACH;
+}
+
 sub _action_rel2abs {
     my ( $self, $c, $path ) = @_;