Don't run the moose controller test if Moose isn't available
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Controller.pm
index 78a60a6..5902597 100644 (file)
@@ -15,19 +15,19 @@ Catalyst::Controller - Catalyst Controller base class
 =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
 
@@ -73,7 +73,7 @@ sub _ACTION : Private {
     my ( $self, $c ) = @_;
     if (   ref $c->action
         && $c->action->can('execute')
-        && $c->req->action )
+        && defined $c->req->action )
     {
         $c->action->dispatch( $c );
     }
@@ -248,7 +248,7 @@ sub _parse_Relative_attr { shift->_parse_Local_attr(@_); }
 
 sub _parse_Path_attr {
     my ( $self, $c, $name, $value ) = @_;
-    $value ||= '';
+    $value = '' if !defined $value;
     if ( $value =~ m!^/! ) {
         return ( 'Path', $value );
     }
@@ -270,11 +270,52 @@ sub _parse_Regexp_attr { shift->_parse_Regex_attr(@_); }
 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/^\+// ) {
@@ -298,18 +339,19 @@ __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.
 
@@ -322,49 +364,49 @@ $self->_application.
 
 =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