=cut
-
sub forward {
- my ( $self, $c, $command ) = splice( @_, 0, 3 );
+ my ( $self, $c, $command ) = splice( @_, 0, 3 );
unless ($command) {
$c->log->debug('Nothing to forward to') if $c->debug;
return 0;
}
- my $args = [ @{ $c->request->arguments } ];
+ my $args = [ @{ $c->request->arguments } ];
- @$args = @{ pop @_ } if ( ref( $_[-1] ) eq 'ARRAY' );
+ @$args = @{ pop @_ } if ( ref( $_[-1] ) eq 'ARRAY' );
my $action = $self->_invoke_as_path( $c, $command, $args )
- || $self->_invoke_as_component( $c, $command, shift );
+ || $self->_invoke_as_component( $c, $command, shift );
- unless ( $action ) {
- my $error = qq/Couldn't forward to command "$command": / . qq/Invalid action or component./;
- $c->error($error);
- $c->log->debug($error) if $c->debug;
- return 0;
- }
+ unless ($action) {
+ my $error =
+ qq/Couldn't forward to command "$command": /
+ . qq/Invalid action or component./;
+ $c->error($error);
+ $c->log->debug($error) if $c->debug;
+ return 0;
+ }
- #push @$args, @_;
+ #push @$args, @_;
- local $c->request->{arguments} = $args;
- $action->execute($c);
+ local $c->request->{arguments} = $args;
+ $action->execute($c);
return $c->state;
}
sub _action_rel2abs {
- my ( $self, $c, $path ) = @_;
-
- unless ( $path =~ m#^/# ) {
- my $namespace = $c->stack->[-1]->namespace;
- $path = "$namespace/$path";
- }
-
- $path =~ s#^/##;
- return $path;
+ my ( $self, $c, $path ) = @_;
+
+ unless ( $path =~ m#^/# ) {
+ my $namespace = $c->stack->[-1]->namespace;
+ $path = "$namespace/$path";
+ }
+
+ $path =~ s#^/##;
+ return $path;
}
sub _invoke_as_path {
- my ( $self, $c, $rel_path, $args ) = @_;
-
- return if ref $rel_path; # it must be a string
-
- my $path = $self->_action_rel2abs( $c, $rel_path );
-
- my ($tail, @extra_args);
- while ( ( $path, $tail ) = ( $path =~ m#^(?:(.*)/)?(\w+)?$# ) ) { # allow $path to be empty
- if ( my $action = $c->get_action( $tail, $path ) ) {
- push @$args, @extra_args;
- return $action;
- } else {
- return unless $path; # if a match on the global namespace failed then the whole lookup failed
- }
-
- unshift @extra_args, $tail;
- }
+ my ( $self, $c, $rel_path, $args ) = @_;
+
+ return if ref $rel_path; # it must be a string
+
+ my $path = $self->_action_rel2abs( $c, $rel_path );
+
+ my ( $tail, @extra_args );
+ while ( ( $path, $tail ) = ( $path =~ m#^(?:(.*)/)?(\w+)?$# ) )
+ { # allow $path to be empty
+ if ( my $action = $c->get_action( $tail, $path ) ) {
+ push @$args, @extra_args;
+ return $action;
+ }
+ else {
+ return
+ unless $path
+ ; # if a match on the global namespace failed then the whole lookup failed
+ }
+
+ unshift @extra_args, $tail;
+ }
}
sub _find_component_class {
- my ( $self, $c, $component ) = @_;
+ my ( $self, $c, $component ) = @_;
- return ref($component)
- || ref( $c->component($component) )
- || $c->component($component)
+ return ref($component)
+ || ref( $c->component($component) )
+ || $c->component($component);
}
sub _invoke_as_component {
- my ( $self, $c, $component, $method ) = @_;
-
- my $class = $self->_find_component_class( $c, $component ) || return 0;
- $method ||= "process";
-
- if ( my $code = $class->can($method) ) {
- return $self->method_action_class->new(
- {
- name => $method,
- code => $code,
- reverse => "$class->$method",
- class => $class,
- namespace => Catalyst::Utils::class2prefix(
- $class, $c->config->{case_sensitive}
- ),
- }
- );
- } else {
- my $error =
- qq/Couldn't forward to "$class". Does not implement "$method"/;
- $c->error($error);
- $c->log->debug($error)
- if $c->debug;
- return 0;
- }
+ my ( $self, $c, $component, $method ) = @_;
+
+ my $class = $self->_find_component_class( $c, $component ) || return 0;
+ $method ||= "process";
+
+ if ( my $code = $class->can($method) ) {
+ return $self->method_action_class->new(
+ {
+ name => $method,
+ code => $code,
+ reverse => "$class->$method",
+ class => $class,
+ namespace => Catalyst::Utils::class2prefix(
+ $class, $c->config->{case_sensitive}
+ ),
+ }
+ );
+ }
+ else {
+ my $error =
+ qq/Couldn't forward to "$class". Does not implement "$method"/;
+ $c->error($error);
+ $c->log->debug($error)
+ if $c->debug;
+ return 0;
+ }
}
=head2 $self->prepare_action($c)
sub get_action {
my ( $self, $name, $namespace ) = @_;
return unless $name;
- $namespace ||= '';
- $namespace = '' if $namespace eq '/';
+
+ $namespace = join( "/", grep { length } split '/', $namespace || "" );
return $self->action_hash->{"$namespace/$name"};
}
+=head2 $self->get_action_by_path( $path );
+
+Returns the named action by its full path.
+
+=cut
+
+sub get_action_by_path {
+ my ( $self, $path ) = @_;
+ $path = "/$path" unless $path =~ /\//;
+ $self->action_hash->{$path};
+}
+
=head2 $self->get_actions( $c, $action, $namespace )
=cut
sub get_actions {
my ( $self, $c, $action, $namespace ) = @_;
return [] unless $action;
- $namespace ||= '';
- $namespace = '' if $namespace eq '/';
+
+ $namespace = join( "/", grep { length } split '/', $namespace || "" );
my @match = $self->get_containers($namespace);
my @containers;
- do {
- push @containers, $self->container_hash->{$namespace};
- } while ( $namespace =~ s#/[^/]+$## );
+ if ( length $namespace ) {
+ do {
+ push @containers, $self->container_hash->{$namespace};
+ } while ( $namespace =~ s#/[^/]+$## );
+ }
return reverse grep { defined } @containers, $self->container_hash->{''};
my $privates = Text::SimpleTable->new(
[ 20, 'Private' ],
- [ 38, 'Class' ],
+ [ 36, 'Class' ],
[ 12, 'Method' ]
);