X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FController.pm;h=256b2c37471c2d59eb122b0deb3a807b131b80ef;hp=29ffc8127304dfee5c24842fadd332e6ce099c9d;hb=46d0346ddafe8e167c679cddef9834946598e689;hpb=0fc2d522eec43202c21e9f0062e43f10db4d9008 diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm index 29ffc81..256b2c3 100644 --- a/lib/Catalyst/Controller.pm +++ b/lib/Catalyst/Controller.pm @@ -1,7 +1,6 @@ package Catalyst::Controller; #switch to BEGIN { extends qw/ ... /; } ? -use Class::C3; use base qw/Catalyst::Component Catalyst::AttrContainer/; use Moose; @@ -12,7 +11,7 @@ use Class::Inspector; has path_prefix => ( - is => 'ro', + is => 'rw', isa => 'Str', init_arg => 'path', predicate => 'has_path_prefix', @@ -20,7 +19,7 @@ has path_prefix => has action_namespace => ( - is => 'ro', + is => 'rw', isa => 'Str', init_arg => 'namespace', predicate => 'has_action_namespace', @@ -123,13 +122,14 @@ sub _END : Private { return !@{ $c->error }; } -sub new { +around new => sub { + my $orig = shift; my $self = shift; my $app = $_[0]; - my $new = $self->next::method(@_); + my $new = $self->$orig(@_); $new->_application( $app ); return $new; -} +}; sub action_for { my ( $self, $name ) = @_; @@ -139,23 +139,17 @@ sub action_for { #my opinion is that this whole sub really should be a builder method, not #something that happens on every call. Anyone else disagree?? -- groditi - -#we are wrapping the accessor, so just uyse a modifier since a normal sub would -#just be overridden by the generated moose method +## -- apparently this is all just waiting for app/ctx split around action_namespace => sub { my $orig = shift; my ( $self, $c ) = @_; if( ref($self) ){ return $self->$orig if $self->has_action_namespace; - } else { - # if the following won't change at runtime it should be lazy_building thing + } else { return $self->config->{namespace} if exists $self->config->{namespace}; } - #the following looks like a possible target for a default setting. i am not - #making the below the builder because i don't know if $c will vary from - #call to call, which would affect case sensitivity settings -- groditi my $case_s; if( $c ){ $case_s = $c->config->{case_sensitive}; @@ -171,7 +165,9 @@ around action_namespace => sub { } } - return Catalyst::Utils::class2prefix(ref($self) || $self, $case_s) || ''; + my $namespace = Catalyst::Utils::class2prefix(ref($self) || $self, $case_s) || ''; + $self->$orig($namespace) if ref($self); + return $namespace; }; #Once again, this is probably better written as a builder method @@ -183,7 +179,9 @@ around path_prefix => sub { } else { return $self->config->{path} if exists $self->config->{path}; } - return $self->action_namespace(@_); + my $namespace = $self->action_namespace(@_); + $self->$orig($namespace) if ref($self); + return $namespace; }; @@ -192,26 +190,18 @@ sub register_actions { my $class = ref $self || $self; #this is still not correct for some reason. my $namespace = $self->action_namespace($c); - my %methods; - if( $self->can('meta') ){ - my $meta = $self->meta; - %methods = map{ $_->{code}->body => $_->{name} } + my $meta = $self->meta; + my %methods = map{ $_->{code}->body => $_->{name} } grep {$_->{class} ne 'Moose::Object'} #ignore Moose::Object methods - $meta->compute_all_applicable_methods; - } else { #until we are sure there's no moose stuff left... - $methods{ $self->can($_) } = $_ - for @{ Class::Inspector->methods($class) || [] }; - } + $meta->compute_all_applicable_methods; + # Advanced inheritance support for plugins and the like - #to be modified to use meta->superclasses #moose todo: migrate to eliminate CDI compat my @action_cache; - { - no strict 'refs'; - for my $isa ( @{"$class\::ISA"}, $class ) { - push @action_cache, @{ $isa->_action_cache } - if $isa->can('_action_cache'); + for my $isa ( $meta->superclasses, $class ) { + if(my $coderef = $isa->can('_action_cache')){ + push(@action_cache, @{ $isa->$coderef }); } } @@ -371,6 +361,8 @@ sub _parse_MyAction_attr { no Moose; +__PACKAGE__->meta->make_immutable; + 1; __END__