X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FBase.pm;h=b1990e9b692eaa599db906f5085fb2563d7028e3;hb=fabf3a100d2255ee3d0d4f7af57b57cd658feceb;hp=addc3ae12e5f7de63f36ec965f592019be8f7482;hpb=5b707014dd4a5a756d22bcafc6c99e2b00a52d06;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Base.pm b/lib/Catalyst/Base.pm index addc3ae..b1990e9 100644 --- a/lib/Catalyst/Base.pm +++ b/lib/Catalyst/Base.pm @@ -72,10 +72,15 @@ See L Catalyst Base Class +This is the base class for all Catalyst components. It also handles +dispatch of actions for controllers. + =head1 METHODS =head2 $self->action_namespace($c) +Determine the namespace for actions in this component. + =cut sub action_namespace { @@ -86,8 +91,18 @@ sub action_namespace { || ''; } +=head2 $self->path_prefix($c) + +alias for action_namespace + +=cut + +sub path_prefix { shift->action_namespace(@_); } + =head2 $self->register_actions($c) +register all actions for this component based on a given context. + =cut sub register_actions { @@ -121,20 +136,24 @@ sub register_actions { next; } my $reverse = $namespace ? "$namespace/$method" : $method; - my $action = $self->_action_class->new( - { - name => $method, - code => $code, - reverse => $reverse, - namespace => $namespace, - class => $class, - attributes => $attrs, - } + my $action = $self->create_action( + name => $method, + code => $code, + reverse => $reverse, + namespace => $namespace, + class => $class, + attributes => $attrs, ); + $c->dispatcher->register( $c, $action ); } } +sub create_action { + my $self = shift; + $self->_action_class->new( { @_ } ); +} + sub _parse_attrs { my ( $self, $c, $name, @attrs ) = @_; my %attributes; @@ -163,27 +182,44 @@ sub _parse_Global_attr { return $self->_parse_Path_attr( $c, $name, "/$name" ); } -*_parse_Absolute_attr = \&_parse_Global_attr; +sub _parse_Absolute_attr { shift->_parse_Global_attr(@_); } sub _parse_Local_attr { my ( $self, $c, $name, $value ) = @_; return $self->_parse_Path_attr( $c, $name, $name ); } -*_parse_Relative_attr = \&_parse_Local_attr; +sub _parse_Relative_attr { shift->_parse_Local_attr(@_); } sub _parse_Path_attr { my ( $self, $c, $name, $value ) = @_; $value ||= ''; if ( $value =~ m!^/! ) { return ( 'Path', $value ); - } elsif ( length $value ) { - return ( 'Path', join( '/', $self->action_namespace($c), $value ) ); - } else { - return ( 'Path', $self->action_namespace($c) ); } + elsif ( length $value ) { + return ( 'Path', join( '/', $self->path_prefix($c), $value ) ); + } + else { + return ( 'Path', $self->path_prefix($c) ); + } +} + +sub _parse_Regex_attr { + my ( $self, $c, $name, $value ) = @_; + return ( 'Regex', $value ); } +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}" ); +} + +sub _parse_LocalRegexp_attr { shift->_parse_LocalRegex_attr(@_); } + =head1 SEE ALSO L, L.