X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=29637225f628e80b8fca4ccd0a10296788386461;hb=5a53ef3ddf982a23c517e4cea657ae678a73bffe;hp=12520e0225949d3c0637be4d3a843fc66b85a3e4;hpb=56089c3b1874315737efea071b798453dbb6c8eb;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 12520e0..2963722 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -536,34 +536,6 @@ sub clear_errors { $c->error(0); } -sub _find_component_regexp { - my ( $c, $container, $name, $args ) = @_; - - return - if $c->config->{disable_component_resolution_regex_fallback} && !ref $name; - - my $appclass = ref $c || $c; - my $prefix = ucfirst $container->name; - my $p = substr $prefix, 0, 1; - - my $query = ref $name ? $name : qr{$name}i; - $query =~ s/^${appclass}::($p|$prefix):://i; - - my @comps = $container->get_service_list; - my @result = map { - $container->resolve( service => $_, parameters => { context => $args } ) - } grep { m/$query/ } @comps; - - if (!ref $name && $result[0]) { - $c->log->warn( Carp::shortmess(qq(Found results for "${name}" using regexp fallback)) ); - $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' ); - $c->log->warn( 'is unreliable and unsafe. You have been warned' ); - return $result[0]; - } - - return @result; -} - =head2 COMPONENT ACCESSORS =head2 $c->controller($name) @@ -586,14 +558,13 @@ If you want to search for controllers, pass in a regexp as the argument. sub controller { my ( $c, $name, @args ) = @_; my $container = $c->container->get_sub_container('controller'); - unshift @args, $c; if( $name ) { # Direct component hash lookup to avoid costly regexps - return $c->container->get_component('controller', $name, \@args) + return $container->get_component( $name, $c, @args ) if $container->has_service($name) && !ref $name; - return $c->_find_component_regexp( $container, $name, \@args ); + return $container->get_component_regexp( $name, $c, @args ); } return $c->component( $c->action->class ); @@ -624,14 +595,13 @@ sub model { my ( $c, $name, @args ) = @_; my $appclass = ref($c) || $c; my $container = $c->container->get_sub_container('model'); - unshift @args, $c; if( $name ) { # Direct component hash lookup to avoid costly regexps - return $c->container->get_component('model', $name, \@args) + return $container->get_component( $name, $c, @args ) if $container->has_service($name) && !ref $name; - return $c->_find_component_regexp( $container, $name, \@args ); + return $container->get_component_regexp( $name, $c, @args ); } if (ref $c) { @@ -654,7 +624,7 @@ sub model { $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' ); } - return $container->resolve( service => $comp, parameters => { context => \@args } ); + return $container->get_component( $comp, $c, @args ); } @@ -683,19 +653,15 @@ sub view { my ( $c, $name, @args ) = @_; my $appclass = ref($c) || $c; my $container = $c->container->get_sub_container('view'); - unshift @args, $c; if( $name ) { - if ( !ref $name ) { # Direct component hash lookup to avoid costly regexps - if ( $container->has_service($name) ) { - return $c->container->get_component('view', $name, \@args); - } - else { - $c->log->warn( "Attempted to use view '$name', but does not exist" ); - } - } + # Direct component hash lookup to avoid costly regexps + return $container->get_component( $name, $c, @args ) + if !ref $name && $container->has_service($name); - return $c->_find_component_regexp( $container, $name, \@args ); + $c->log->warn( "Attempted to use view '$name', but does not exist" ); + + return $container->get_component_regexp( $name, $c, @args ); } if (ref $c) { @@ -717,7 +683,7 @@ sub view { $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' ); } - return $container->resolve( service => $comp, parameters => { context => \@args } ); + return $container->get_component( $comp, $c, @args ); } =head2 $c->controllers @@ -766,66 +732,40 @@ should be used instead. If C<$name> is a regexp, a list of components matched against the full component name will be returned. -If Catalyst can't find a component by name, it will fallback to regex -matching by default. To disable this behaviour set -disable_component_resolution_regex_fallback to a true value. - - __PACKAGE__->config( disable_component_resolution_regex_fallback => 1 ); - =cut sub component { my ( $c, $component, @args ) = @_; if ( $component ) { + # FIXME: I probably shouldn't be doing this + return $c->components->{$component} + if exists $c->components->{$component}; + my ($type, $name) = _get_component_type_name($component); if ($type && $c->container->has_sub_container($type)) { my $container = $c->container->get_sub_container($type); if( !ref $component && $container->has_service($name) ) { - return $container->resolve( service => $name, parameters => { context => [ $c, @args ] } ); + return $container->get_component( $name, $c, @args ); } - return - if $c->config->{disable_component_resolution_regex_fallback}; - - my $query = qr{$name}i; - my @components = $container->get_service_list; - my @result = grep { m{$query} } @components; - - if (@result) { - $c->log->warn( Carp::shortmess(qq(Found results for "${component}" using regexp fallback)) ); - $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' ); - $c->log->warn( 'is unreliable and unsafe. You have been warned' ); - - return $container->resolve( service => $result[0], parameters => { context => [$c, @args] } ); - } + return $container->get_component_regexp( $name, $c, @args ); } - return - if $c->config->{disable_component_resolution_regex_fallback} && !ref $component; - - # This is here so $c->comp( '::M::' ) works - my $query = ref $component ? $component : qr{$component}i; - - for my $subcontainer_name (qw/model view controller/) { - my $subcontainer = $c->container->get_sub_container($subcontainer_name); - my @components = $subcontainer->get_service_list; - my @result = grep { m{$query} } @components; + if (ref $component) { + for my $subcontainer_name (qw/model view controller/) { + my $subcontainer = $c->container->get_sub_container($subcontainer_name); + my @components = $subcontainer->get_service_list; + my @result = grep { m{$component} } @components; - if (@result) { - return map { $subcontainer->resolve( service => $_, parameters => { context => [$c, @args] } ) } @result - if ref $component; - - $c->log->warn( Carp::shortmess(qq(Found results for "${component}" using regexp fallback)) ); - $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' ); - $c->log->warn( 'is unreliable and unsafe. You have been warned' ); - - return $subcontainer->resolve( service => $result[0], parameters => { context => [$c, @args] } ); + return map { $subcontainer->get_component( $_, $c, @args ) } @result; } } + $c->log->warn("Looking for '$component', but nothing was found."); + # I would expect to return an empty list here, but that breaks back-compat } @@ -1566,7 +1506,7 @@ around components => sub { my ($type, $name) = _get_component_type_name($component); # FIXME: shouldn't the service name be $name? - $containers->{$type}->add_service(Catalyst::BlockInjection->new( name => $name, block => sub { return $class->setup_component($component) } )); + $containers->{$type}->add_service(Catalyst::IOC::BlockInjection->new( name => $name, block => sub { return $class->setup_component($component) } )); } return $class->$orig($components); @@ -2403,7 +2343,7 @@ sub setup_config { my %args = %{ $class->config || {} }; - my @container_classes = ( "${class}::Container", 'Catalyst::Container'); + my @container_classes = ( "${class}::Container", 'Catalyst::IOC::Container'); unshift @container_classes, delete $args{container_class} if exists $args{container_class}; my $container_class = Class::MOP::load_first_existing_class(@container_classes); @@ -2416,7 +2356,7 @@ sub setup_config { $class->finalize_config; # back-compat } -=head $c->finalize_config +=head2 $c->finalize_config =cut @@ -2465,7 +2405,7 @@ sub setup_components { for my $component (@comps) { my $instance = $class->components->{ $component } = $class->setup_component($component); if ( my ($type, $name) = _get_component_type_name($component) ) { - $containers->{$type}->add_service(Catalyst::BlockInjection->new( name => $name, block => sub { return $instance } )); + $containers->{$type}->add_service(Catalyst::IOC::BlockInjection->new( name => $name, block => sub { return $instance } )); } my @expanded_components = $instance->can('expand_modules') ? $instance->expand_modules( $component, $config ) @@ -2479,7 +2419,7 @@ sub setup_components { ) if $deprecatedcatalyst_component_names; if (my ($type, $name) = _get_component_type_name($component)) { - $containers->{$type}->add_service(Catalyst::BlockInjection->new( name => $name, block => sub { return $class->setup_component($component) } )); + $containers->{$type}->add_service(Catalyst::IOC::BlockInjection->new( name => $name, block => sub { return $class->setup_component($component) } )); } $class->components->{ $component } = $class->setup_component($component); @@ -2966,14 +2906,6 @@ C - The default view to be rendered or returned when C<< $c->view =item * -C - Turns -off the deprecated component resolution functionality so -that if any of the component methods (e.g. C<< $c->controller('Foo') >>) -are called then regex search will not be attempted on string values and -instead C will be returned. - -=item * - C - The application home directory. In an uninstalled application, this is the top level application directory. In an installed application, this will be the directory containing C<< MyApp.pm >>. @@ -3147,6 +3079,8 @@ Andrew Ford EA.Ford@ford-mason.co.ukE Andrew Ruthven +André Walker + andyg: Andy Grundman audreyt: Audrey Tang