X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=46d0e8b885b6c0f595fcc4a6b556d3cbbeaf72ba;hb=e10b40fdbf404819d60169dee88175777d1bf109;hp=369b6248b4d057b6d8c267777bfa5918af782f79;hpb=83db87df7ee52592ca190f353529778900e75f18;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 369b624..46d0e8b 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -557,39 +557,9 @@ 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'); - my $appclass = ref $c || $c; - if( $name ) { - if ( !ref $name ) { # Direct component hash lookup to avoid costly regexps - return $container->resolve(service => $name, parameters => { context => [ $c, @args ] } ) - if $container->has_service($name); - } - - return - if $c->config->{disable_component_resolution_regex_fallback} && !ref $name; - - my $query = ref $name ? $name : qr{$name}; - $query =~ s/^${appclass}::(C|Controller):://; - my @comps = $container->get_service_list; - my @result; - for (@comps) { - push @result, $container->resolve( service => $_, parameters => { context => [ $c, @args ] } ) - if m/$query/; - } - - if (@result) { - if (!ref $name) { - $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; - } - - return; - } + return $c->container->get_component_from_sub_container( 'controller', $name, $c, @args) + if( $name ); return $c->component( $c->action->class ); } @@ -620,35 +590,8 @@ sub model { my $appclass = ref($c) || $c; my $container = $c->container->get_sub_container('model'); - if( $name ) { - if ( !ref $name && $container->has_service($name)) { # Direct component hash lookup to avoid costly regexps - return $container->resolve( service => $name, parameters => { context => [ $c, @args ] } ); - } - - return - if $c->config->{disable_component_resolution_regex_fallback} && !ref $name; - - my $query = ref $name ? $name : qr{$name}; - $query =~ s/^${appclass}::(M|Model):://; - my @comps = $container->get_service_list; - my @result; - for (@comps) { - push @result, $container->resolve( service => $_, parameters => { context => [ $c, @args ] } ) - if m/$query/; - } - - if (@result) { - if (!ref $name) { - $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; - } - - return; - } + return $c->container->get_component_from_sub_container( 'model', $name, $c, @args) + if( $name ); if (ref $c) { return $c->stash->{current_model_instance} @@ -670,7 +613,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 => [ $c, @args ] } ); + return $container->get_component( $comp, $c, @args ); } @@ -700,40 +643,8 @@ sub view { my $appclass = ref($c) || $c; my $container = $c->container->get_sub_container('view'); - if( $name ) { - if ( !ref $name ) { # Direct component hash lookup to avoid costly regexps - if ( $container->has_service($name) ) { - return $container->resolve( service => $name, parameters => { context => [ $c, @args ] } ); - } - else { - $c->log->warn( "Attempted to use view '$name', but does not exist" ); - } - } - - return - if $c->config->{disable_component_resolution_regex_fallback} && !ref $name; - - my $query = ref $name ? $name : qr{$name}; - $query =~ s/^${appclass}::(V|View):://; - my @comps = $container->get_service_list; - my @result; - for (@comps) { - push @result, $container->resolve( service => $_, parameters => { context => [ $c, @args ] } ) - if m/$query/; - } - - if (@result) { - if (!ref $name) { - $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; - } - - return; - } + return $c->container->get_component_from_sub_container( 'view', $name, $c, @args) + if( $name ); if (ref $c) { return $c->stash->{current_view_instance} @@ -754,7 +665,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 => [ $c, @args ] } ); + return $container->get_component( $comp, $c, @args ); } =head2 $c->controllers @@ -803,51 +714,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}; - # 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 (@result) { - return map { $subcontainer->resolve( service => $_, parameters => { context => [$c, @args] } ) } @result - if ref $component; + return $container->get_component_regexp( $name, $c, @args ); + } - $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' ); + 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; - 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 } @@ -1588,7 +1488,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); @@ -2425,7 +2325,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); @@ -2438,7 +2338,7 @@ sub setup_config { $class->finalize_config; # back-compat } -=head $c->finalize_config +=head2 $c->finalize_config =cut @@ -2487,7 +2387,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 ) @@ -2501,7 +2401,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); @@ -2988,14 +2888,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 >>. @@ -3169,6 +3061,8 @@ Andrew Ford EA.Ford@ford-mason.co.ukE Andrew Ruthven +André Walker + andyg: Andy Grundman audreyt: Audrey Tang