X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=f1263a89baba31e276dc5e7c86f24a4bfa8c6b95;hb=77e27f6ec357bc9b622587b49ca10bca9dd89117;hp=387e0be5cd138d7eb8a40b9c3fe44fc82a756a31;hpb=59aacfa7d98f47411ad0536e54005a996c3b5bf1;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 387e0be..f1263a8 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,13 +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 ) { - return $container->get_component($name, \@args) + # Direct component hash lookup to avoid costly regexps + 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 ); @@ -623,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 $container->get_component($name, \@args) - if ( !ref $name && $container->has_service($name)); + 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) { @@ -653,7 +624,7 @@ sub model { $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' ); } - return $container->get_component( $comp, \@args ); + return $container->get_component( $comp, $c, @args ); } @@ -682,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 $container->get_component($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) { @@ -716,7 +683,7 @@ sub view { $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' ); } - return $container->get_component( $comp, \@args ); + return $container->get_component( $comp, $c, @args ); } =head2 $c->controllers @@ -787,20 +754,7 @@ sub component { return $container->get_component( $name, \@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->get_component( $result[0], \@args ); - } + return $container->get_component_regexp( $c, $name, \@args ); } return @@ -1566,7 +1520,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,12 +2357,16 @@ 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); - my $container = $container_class->new( %args, name => "$class" ); + my $container = $container_class->new( %args, + name => "$class", + disable_regex_fallback => + $class->config->{disable_component_resolution_regex_fallback}, + ); $class->container($container); my $config = $container->resolve(service => 'config'); @@ -2416,7 +2374,7 @@ sub setup_config { $class->finalize_config; # back-compat } -=head $c->finalize_config +=head2 $c->finalize_config =cut @@ -2465,7 +2423,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 +2437,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); @@ -3147,6 +3105,8 @@ Andrew Ford EA.Ford@ford-mason.co.ukE Andrew Ruthven +André Walker + andyg: Andy Grundman audreyt: Audrey Tang