has _method_action_class => (is => 'rw', default => 'Catalyst::Action');
has _action_hash => (is => 'rw', required => 1, lazy => 1, default => sub { {} });
has _container_hash => (is => 'rw', required => 1, lazy => 1, default => sub { {} });
-
has preload_dispatch_types => (is => 'rw', required => 1, lazy => 1, default => sub { [@PRELOAD] });
+
has postload_dispatch_types => (is => 'rw', required => 1, lazy => 1, default => sub { [@POSTLOAD] });
# Wrap accessors so you can assign a list and it will capture a list ref.
}
# $self->_command2action( $c, $command [, \@arguments ] )
-# Search for an action, from the command and returns C<($action, $args)> on
+# $self->_command2action( $c, $command [, \@captures, \@arguments ] )
+# Search for an action, from the command and returns C<($action, $args, $captures)> on
# success. Returns C<(0)> on error.
sub _command2action {
return 0;
}
- my @args;
+ my (@args, @captures);
+
+ if ( ref( $extra_params[-2] ) eq 'ARRAY' ) {
+ @captures = @{ pop @extra_params };
+ }
if ( ref( $extra_params[-1] ) eq 'ARRAY' ) {
@args = @{ pop @extra_params }
$action = $self->_invoke_as_component( $c, $command, $method );
}
- return $action, \@args;
+ return $action, \@args, \@captures;
}
=head2 $self->visit( $c, $command [, \@arguments ] )
my $self = shift;
my $opname = shift;
my ( $c, $command ) = @_;
- my ( $action, $args ) = $self->_command2action(@_);
+ my ( $action, $args, $captures ) = $self->_command2action(@_);
my $error = qq/Couldn't $opname("$command"): /;
if (!$action) {
$action = $self->expand_action($action);
local $c->request->{arguments} = $args;
+ local $c->request->{captures} = $captures;
local $c->{namespace} = $action->{'namespace'};
local $c->{action} = $action;
my $self = shift;
my $opname = shift;
my ( $c, $command ) = @_;
- my ( $action, $args ) = $self->_command2action(@_);
+ my ( $action, $args, $captures ) = $self->_command2action(@_);
if (!$action) {
my $error .= qq/Couldn't $opname to command "$command": /
my $class = $self->_find_component_class( $c, $component ) || return 0;
+ ### XXX FIXME - Horrible hack to get proper action objects for
+ ### controller paths..
+ if ($class =~ /::C(ontroller)?::/) {
+ my $possible_path = $class . '/' . $method;
+ $possible_path =~ s/.+::C(ontroller)?:://;
+ $possible_path =~ s|::|/|g;
+ $possible_path =~ tr/A-Z/a-z/;
+ my $possible_action = $self->_invoke_as_path( $c, '/' . $possible_path );
+ return $possible_action if $possible_action;
+ }
+
if ( my $code = $class->can($method) ) {
return $self->_method_action_class->new(
{
=head2 $self->setup_actions( $class, $context )
Loads all of the preload dispatch types, registers their actions and then
-loads all of the postload dispatch types, and does dispatcher initialization.
+loads all of the postload dispatch types, and iterates over the tree of
+actions, displaying the debug information if appropriate.
=cut
$self->_load_dispatch_types( @{ $self->postload_dispatch_types } );
return unless $c->debug;
+ $self->_display_action_tables($c);
+}
+
+sub _display_action_tables {
+ my ($self, $c) = @_;
my $column_width = Catalyst::Utils::term_width() - 20 - 36 - 12;
my $privates = Text::SimpleTable->new(
return @loaded;
}
+# Dont document this until someone else is happy with beaviour. Ash 2009/03/16
+sub dispatch_type {
+ my ($self, $name) = @_;
+
+ unless ($name =~ s/^\+//) {
+ $name = "Catalyst::DispatchType::" . $name;
+ }
+
+ for (@{ $self->_dispatch_types }) {
+ return $_ if ref($_) eq $name;
+ }
+ return undef;
+}
+
use Moose;
# 5.70 backwards compatibility hacks.