}
elsif (!defined $action->namespace) {
$error .= qq/Action has no namespace: cannot $opname() to a plain /
- .qq/method or component, must be a :Action or some sort./
+ .qq/method or component, must be an :Action of some sort./
}
elsif (!$action->class->can('_DISPATCH')) {
$error .= qq/Action cannot _DISPATCH. /
}
}
-sub _find_component_class {
+sub _find_component {
my ( $self, $c, $component ) = @_;
- return ref($component)
- || ref( $c->component($component) )
- || $c->component($component);
+ # fugly, why doesn't ->component('MyApp') work?
+ return $c if ($component eq blessed($c));
+
+ return blessed($component)
+ ? $component
+ : $c->component($component);
}
sub _invoke_as_component {
- my ( $self, $c, $component, $method ) = @_;
-
- 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 );
+ my ( $self, $c, $component_or_class, $method ) = @_;
+
+ my $component = $self->_find_component($c, $component_or_class);
+ my $component_class = blessed $component || return 0;
+
+ if (my $code = $component_class->can('action_for')) {
+ my $possible_action = $component->$code($method);
return $possible_action if $possible_action;
}
- if ( my $code = $class->can($method) ) {
+ if ( my $code = $component_class->can($method) ) {
return $self->_method_action_class->new(
{
name => $method,
code => $code,
- reverse => "$class->$method",
- class => $class,
+ reverse => "$component_class->$method",
+ class => $component_class,
namespace => Catalyst::Utils::class2prefix(
- $class, $c->config->{case_sensitive}
+ $component_class, $c->config->{case_sensitive}
),
}
);
}
else {
my $error =
- qq/Couldn't forward to "$class". Does not implement "$method"/;
+ qq/Couldn't forward to "$component_class". Does not implement "$method"/;
$c->error($error);
$c->log->debug($error)
if $c->debug;