(
is => 'rw',
isa => 'Str',
- init_arg => 'path', # 5.7 compat
+ init_arg => 'path',
predicate => 'has_path_prefix',
);
(
is => 'rw',
isa => 'Str',
- init_arg => 'namespace', # 5.7 compat
+ init_arg => 'namespace',
predicate => 'has_action_namespace',
);
(
is => 'rw',
isa => 'HashRef',
- init_arg => 'action', # 5.7 compat
+ init_arg => undef,
);
-around BUILDARGS => sub { # Icky 5.7 compat
- my $orig = shift;
- my $self = shift;
- my $args = $self->$orig(@_);
+sub BUILD {
+ my ($self, $args) = @_;
my $action = delete $args->{action} || {};
my $actions = delete $args->{actions} || {};
- $args->{action} = $self->merge_config_hashes($actions, $action);
- return $args;
-};
+ my $attr_value = $self->merge_config_hashes($actions, $action);
+ $self->_controller_actions($attr_value);
+}
+
+
=head1 NAME
}
}
- my $namespace = Catalyst::Utils::class2prefix(ref($self) || $self, $case_s) || '';
+ my $namespace = Catalyst::Utils::class2prefix($self->_component_name, $case_s) || '';
$self->$orig($namespace) if ref($self);
return $namespace;
};
sub get_action_methods {
my $self = shift;
- my $meta = find_meta($self);
- confess("Metaclass for " . ref($meta) ." for " . $meta->name
- . " cannot support register_actions.")
- unless $meta->can('get_nearest_methods_with_attributes');
+ my $meta = find_meta($self) || confess("No metaclass setup for $self");
+ confess("Metaclass "
+ . ref($meta) . " for "
+ . $meta->name
+ . " cannot support register_actions." )
+ unless $meta->can('get_nearest_methods_with_attributes');
my @methods = $meta->get_nearest_methods_with_attributes;
+
+ # actions specified via config are also action_methods
+ push(
+ @methods,
+ map {
+ $meta->find_method_by_name($_)
+ || confess( 'Action "'
+ . $_
+ . '" is not available from controller '
+ . ( ref $self ) )
+ } keys %{ $self->_controller_actions }
+ ) if ( ref $self );
return @methods;
}
+
sub register_actions {
my ( $self, $c ) = @_;
$self->register_action_methods( $c, $self->get_action_methods );
sub register_action_methods {
my ( $self, $c, @methods ) = @_;
- my $class = ref $self || $self;
+ my $class = $self->_component_name;
#this is still not correct for some reason.
my $namespace = $self->action_namespace($c);
+ # Uncomment as soon as you fix the tests :)
+ #if (!blessed($self) && $self eq $c && scalar(@methods)) {
+ # $c->log->warn("Action methods found defined in your application class, $self. This is deprecated, please move them into a Root controller.");
+ #}
+
foreach my $method (@methods) {
my $name = $method->name;
my $attributes = $method->attributes;
- next unless $attributes;
my $attrs = $self->_parse_attrs( $c, $name, @{ $attributes } );
if ( $attrs->{Private} && ( keys %$attrs > 1 ) ) {
$c->log->debug( 'Bad action definition "'
}
sub _parse_PathPrefix_attr {
- my $self = shift;
- return PathPart => $self->path_prefix;
+ my ( $self, $c ) = @_;
+ return PathPart => $self->path_prefix($c);
}
sub _parse_ActionClass_attr {
my ( $self, $c, $name, $value ) = @_;
- unless ( $value =~ s/^\+// ) {
- $value = join('::', $self->_action_class, $value );
- }
+ my $appname = $self->_application;
+ $value = Catalyst::Utils::resolve_namespace($appname . '::Action', $self->_action_class, $value);
return ( 'ActionClass', $value );
}
=head1 COPYRIGHT
-This program is free software, you can redistribute it and/or modify
+This library is free software. You can redistribute it and/or modify
it under the same terms as Perl itself.
=cut