X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FController.pm;h=256b2c37471c2d59eb122b0deb3a807b131b80ef;hb=ce50990ee94a229c4814be98afc17f2b6a065a43;hp=2e58312c903062b567ada8e402f94f2117f633ea;hpb=ac5c933bdd463558e8d621507a53a7b247a9093e;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm index 2e58312..256b2c3 100644 --- a/lib/Catalyst/Controller.pm +++ b/lib/Catalyst/Controller.pm @@ -11,7 +11,7 @@ use Class::Inspector; has path_prefix => ( - is => 'ro', + is => 'rw', isa => 'Str', init_arg => 'path', predicate => 'has_path_prefix', @@ -19,7 +19,7 @@ has path_prefix => has action_namespace => ( - is => 'ro', + is => 'rw', isa => 'Str', init_arg => 'namespace', predicate => 'has_action_namespace', @@ -34,7 +34,7 @@ has actions => # isa => 'ClassName|Catalyst' ? has _application => (is => 'rw'); -sub _app{ shift->_application(@_) } # eww +sub _app{ shift->_application(@_) } sub BUILD { my ($self, $args) = @_; @@ -137,8 +137,12 @@ sub action_for { return $app->dispatcher->get_action($name, $self->action_namespace); } +#my opinion is that this whole sub really should be a builder method, not +#something that happens on every call. Anyone else disagree?? -- groditi +## -- apparently this is all just waiting for app/ctx split around action_namespace => sub { - my ( $orig, $self, $c ) = @_; + my $orig = shift; + my ( $self, $c ) = @_; if( ref($self) ){ return $self->$orig if $self->has_action_namespace; @@ -146,9 +150,6 @@ around action_namespace => sub { 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 sensitivitysettings -- groditi my $case_s; if( $c ){ $case_s = $c->config->{case_sensitive}; @@ -164,10 +165,12 @@ 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 around path_prefix => sub { my $orig = shift; my $self = shift; @@ -176,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; }; @@ -185,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 }); } } @@ -362,6 +359,10 @@ sub _parse_MyAction_attr { return ( 'ActionClass', $value ); } +no Moose; + +__PACKAGE__->meta->make_immutable; + 1; __END__