sub detach {
my ( $c, $command, @args ) = @_;
$c->forward( $command, @args ) if $command;
+ # die with DETACH signal, which will be caught in dispatching.
die $Catalyst::Engine::DETACH;
}
$c->execute( @{ $end->[0] } );
return if scalar @{ $c->error };
}
- }
-
- else {
+ } else {
my $path = $c->req->path;
my $error = $path
? qq/Unknown resource "$path"/
return 0;
}
- my $caller = caller(0);
+ # Relative forwards from detach
+ my $caller = ( caller(0) )[0]->isa('Catalyst::Dispatcher')
+ && ( ( caller(1) )[3] =~ /::detach$/ ) ? caller(1) : caller(0);
+
my $namespace = '/';
my $arguments = ( ref( $_[-1] ) eq 'ARRAY' ) ? pop(@_) : $c->req->args;
unless ( @{$results} ) {
- unless ( $c->components->{$command} ) {
+ unless ( defined( $c->components->{$command} ) ) {
my $error =
qq/Couldn't forward to command "$command". Invalid action or component./;
$c->error($error);
if ( my $code = $c->components->{$class}->can($method) ) {
$c->actions->{reverse}->{"$code"} = "$class->$method";
$results = [ [ [ $class, $code ] ] ];
- }
-
- else {
+ } else {
my $error =
qq/Couldn't forward to "$class". Does not implement "$method"/;
$c->error($error);
push @results, [$result] if $result;
my $visitor = Tree::Simple::Visitor::FindByPath->new;
+ SEARCH:
for my $part ( split '/', $namespace ) {
$visitor->setSearchPath($part);
$parent->accept($visitor);
my $uid = $child->getUID if $child;
my $match = $c->actions->{private}->{$uid}->{$action} if $uid;
push @results, [$match] if $match;
- $parent = $child if $child;
+ if ($child) {
+ $parent = $child;
+ }
+ else {
+ last SEARCH;
+ }
}
}
if ( $flags{path} ) {
$flags{path} =~ s/^\w+//;
$flags{path} =~ s/\w+$//;
- if ( $flags{path} =~ /^'(.*)'$/ ) { $flags{path} = $1 }
- if ( $flags{path} =~ /^"(.*)"$/ ) { $flags{path} = $1 }
+ if ( $flags{path} =~ /^\s*'(.*)'\s*$/ ) { $flags{path} = $1 }
+ if ( $flags{path} =~ /^\s*"(.*)"\s*$/ ) { $flags{path} = $1 }
}
if ( $flags{regex} ) {
$flags{regex} =~ s/^\w+//;
$flags{regex} =~ s/\w+$//;
- if ( $flags{regex} =~ /^'(.*)'$/ ) { $flags{regex} = $1 }
- if ( $flags{regex} =~ /^"(.*)"$/ ) { $flags{regex} = $1 }
+ if ( $flags{regex} =~ /^\s*'(.*)'\s*$/ ) { $flags{regex} = $1 }
+ if ( $flags{regex} =~ /^\s*"(.*)"\s*$/ ) { $flags{regex} = $1 }
}
my $reverse = $prefix ? "$prefix/$method" : $method;