=head1 SYNOPSIS
package MyApp::Controller::Search
- use base qw/Catalyst::Controller;
+ use base qw/Catalyst::Controller/;
sub foo : Local {
- my ($self,$c,@args) = @_;
- ...
+ my ($self,$c,@args) = @_;
+ ...
} # Dispatches to /search/foo
=head1 DESCRIPTION
-Controllers are where the actions in the Catalyst framework reside. each
-action is represented by a function with an attribute to identify what kind
-of action it is. See the L<Catalyst::Dispatcher> for more info about how
-Catalyst dispatches to actions.
+Controllers are where the actions in the Catalyst framework
+reside. Each action is represented by a function with an attribute to
+identify what kind of action it is. See the L<Catalyst::Dispatcher>
+for more info about how Catalyst dispatches to actions.
=cut
my ( $self, $c ) = @_;
if ( ref $c->action
&& $c->action->can('execute')
- && $c->req->action )
+ && defined $c->req->action )
{
$c->action->dispatch( $c );
}
sub _parse_Path_attr {
my ( $self, $c, $name, $value ) = @_;
- $value ||= '';
+ $value = '' if !defined $value;
if ( $value =~ m!^/! ) {
return ( 'Path', $value );
}
sub _parse_LocalRegex_attr {
my ( $self, $c, $name, $value ) = @_;
unless ( $value =~ s/^\^// ) { $value = "(?:.*?)$value"; }
- return ( 'Regex', '^' . $self->path_prefix($c) . "/${value}" );
+
+ my $prefix = $self->path_prefix( $c );
+ $prefix .= '/' if length( $prefix );
+
+ return ( 'Regex', "^${prefix}${value}" );
}
sub _parse_LocalRegexp_attr { shift->_parse_LocalRegex_attr(@_); }
+sub _parse_Chained_attr {
+ my ($self, $c, $name, $value) = @_;
+
+ if (defined($value) && length($value)) {
+ if ($value eq '.') {
+ $value = '/'.$self->action_namespace($c);
+ } elsif (my ($rel, $rest) = $value =~ /^((?:\.{2}\/)+)(.*)$/) {
+ my @parts = split '/', $self->action_namespace($c);
+ my @levels = split '/', $rel;
+
+ $value = '/'.join('/', @parts[0 .. $#parts - @levels], $rest);
+ } elsif ($value !~ m/^\//) {
+ my $action_ns = $self->action_namespace($c);
+
+ if ($action_ns) {
+ $value = '/'.join('/', $action_ns, $value);
+ } else {
+ $value = '/'.$value; # special case namespace '' (root)
+ }
+ }
+ } else {
+ $value = '/'
+ }
+
+ return Chained => $value;
+}
+
+sub _parse_ChainedParent_attr {
+ my ($self, $c, $name, $value) = @_;
+ return $self->_parse_Chained_attr($c, $name, '../'.$name);
+}
+
+sub _parse_PathPrefix_attr {
+ my $self = shift;
+ return PathPart => $self->path_prefix;
+}
+
sub _parse_ActionClass_attr {
my ( $self, $c, $name, $value ) = @_;
unless ( $value =~ s/^\+// ) {
return ( 'ActionClass', $value );
}
-sub _parse_PathPrefix_attr {
- my ( $self, $c, $name, $value ) = @_;
- return PathPart => $self->path_prefix;
-}
-
1;
__END__
=head1 CONFIGURATION
-As any other L<Catalyst::Component>, controllers have a config
-hash, accessable through $self->config from the controller actions.
-Some settings are in use by the Catalyst framework:
+Like any other L<Catalyst::Component>, controllers have a config hash,
+accessible through $self->config from the controller actions. Some
+settings are in use by the Catalyst framework:
=head2 namespace
-This spesifies the internal namespace the controller should be bound to. By default
-the controller is bound to the uri version of the controller name. For instance
-controller 'MyApp::Controller::Foo::Bar' will be bound to 'foo/bar'. The default Root
-controller is an example of setting namespace to ''.
+This specifies the internal namespace the controller should be bound
+to. By default the controller is bound to the URI version of the
+controller name. For instance controller 'MyApp::Controller::Foo::Bar'
+will be bound to 'foo/bar'. The default Root controller is an example
+of setting namespace to '' (the null string).
-=head2 prefix
+=head2 path
Sets 'path_prefix', as described below.
=head2 $self->action_for('name')
-Returns the Catalyst::Action object (if any) for a given method name in
-this component.
+Returns the Catalyst::Action object (if any) for a given method name
+in this component.
=head2 $self->register_actions($c)
-Finds all applicable actions for this component, creates Catalyst::Action
-objects (using $self->create_action) for them and registers them with
-$c->dispatcher.
+Finds all applicable actions for this component, creates
+Catalyst::Action objects (using $self->create_action) for them and
+registers them with $c->dispatcher.
=head2 $self->action_namespace($c)
-Returns the private namespace for actions in this component. Defaults to a value
-from the controller name (for e.g. MyApp::Controller::Foo::Bar becomes
-"foo/bar") or can be overriden from the "namespace" config key.
+Returns the private namespace for actions in this component. Defaults
+to a value from the controller name (for
+e.g. MyApp::Controller::Foo::Bar becomes "foo/bar") or can be
+overridden from the "namespace" config key.
=head2 $self->path_prefix($c)
-Returns the default path prefix for :Local, :LocalRegex and relative :Path
-actions in this component. Defaults to the action_namespace or can be
-overriden from the "path" config key.
+Returns the default path prefix for :PathPrefix, :Local, :LocalRegex and
+relative :Path actions in this component. Defaults to the action_namespace or
+can be overridden from the "path" config key.
=head2 $self->create_action(%args)
-Called with a hash of data to be use for construction of a new Catalyst::Action
-(or appropriate sub/alternative class) object.
+Called with a hash of data to be use for construction of a new
+Catalyst::Action (or appropriate sub/alternative class) object.
Primarily designed for the use of register_actions.
-=head2 $self->_application
+=head2 $self->_application
=head2 $self->_app
Returns the application instance stored by C<new()>
-=head1 AUTHOR
+=head1 AUTHORS
-Sebastian Riedel, C<sri@oook.de>
-Marcus Ramberg C<mramberg@cpan.org>
+Catalyst Contributors, see Catalyst.pm
=head1 COPYRIGHT
-This program is free software, you can redistribute it and/or modify it under
-the same terms as Perl itself.
+This program is free software, you can redistribute it and/or modify
+it under the same terms as Perl itself.
=cut