X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=4d1be1494dea39694db20d14574ef968bcdc826f;hb=19c64905295c1483ceaa41d0ba498b52bf4fab5e;hp=c9ccf8d83f2a25fe2e97c6c0fb069bcd1950bab0;hpb=be80b0a574d01d0afc55a4e3e8a67af01086b95a;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index c9ccf8d..4d1be14 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -27,7 +27,6 @@ use URI::https; use Tree::Simple qw/use_weak_refs/; use Tree::Simple::Visitor::FindByUID; use Class::C3::Adopt::NEXT; -use Hash::Util qw/lock_hash/; use List::MoreUtils qw/uniq/; use attributes; use utf8; @@ -704,19 +703,8 @@ sub component { return $c->component_list; } - my ($type, $name) = _get_component_type_name($component); - - return $c->container->get_component_from_sub_container( - $type, $name, $c, @args - ) if $type; - my @result = $c->container->find_component( $component, $c, @args ); - # one last search for things like $c->comp(qr/::M::/) - @result = $c->container->find_component_regexp( - $c->components, $component, $c, @args - ) if !@result and ref $component; - # list context for regexp searches return @result if ref $component; @@ -1454,39 +1442,16 @@ Returns a hash of components. sub components { my ( $class, $comps ) = @_; - # FIXME: should this ugly kludge exist? - $class->setup_config unless defined $class->container; - - my $containers; - $containers->{$_} = $class->container->get_sub_container($_) - for qw(model view controller); + # people create components calling this sub directly, before setup + $class->setup_config unless my $container = $class->container; if ( $comps ) { - for my $component ( keys %$comps ) { - my ($type, $name) = _get_component_type_name($component); - - $containers->{$type}->add_service( - Catalyst::IOC::BlockInjection->new( - name => $name, - block => sub { $class->setup_component($component) }, - ) - ); - } - } - - my %components; - for my $container (keys %$containers) { - my @service_list = $containers->{$container}->get_service_list; - for my $component (@service_list) { - my $comp = $containers->{$container}->resolve( - service => $component - ); - my $comp_name = ref $comp || $comp; - $components{$comp_name} = $comp; - } + $container->add_component( + $_, $class->setup_component($_) + ) for keys %$comps; } - return lock_hash %components; + return $container->get_all_components(); } =head2 $c->context_class @@ -2358,7 +2323,12 @@ sub setup_components { my $class = shift; my $config = $class->config->{ setup_components }; - my $search_extra = $config->{ search_extra }; + + Catalyst::Exception->throw( + qq{You are using search_extra config option. That option is\n} . + qq{deprecated, please refer to the documentation for\n} . + qq{other ways of achieving the same results.\n} + ) if delete $config->{ search_extra }; my @comps = $class->locate_components($config); my %comps = map { $_ => 1 } @comps; @@ -2377,14 +2347,9 @@ sub setup_components { Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } ); } - my $containers; - $containers->{$_} = $class->container->get_sub_container($_) for qw(model view controller); - for my $component (@comps) { my $instance = $class->setup_component($component); - if ( my ($type, $name) = _get_component_type_name($component, $search_extra) ) { - $containers->{$type}->add_service(Catalyst::IOC::BlockInjection->new( name => $name, block => sub { return $instance } )); - } + $class->container->add_component( $component, $instance ); my @expanded_components = $instance->can('expand_modules') ? $instance->expand_modules( $component, $config ) : $class->expand_component_module( $component, $config ); @@ -2396,52 +2361,14 @@ sub setup_components { qq{Please switch your class names to ::Model::, ::View:: and ::Controller: as appropriate.\n} ) if $deprecatedcatalyst_component_names; - if (my ($type, $name) = _get_component_type_name($component, $search_extra)) { - $containers->{$type}->add_service(Catalyst::IOC::BlockInjection->new( name => $name, block => sub { return $class->setup_component($component) } )); - } + $class->container->add_component( $component, $class->setup_component($component) ); } } - $containers->{model}->make_single_default; - $containers->{view}->make_single_default; + $class->container->get_sub_container('model')->make_single_default; + $class->container->get_sub_container('view')->make_single_default; } -# FIXME: should this sub exist? -# should it be moved to Catalyst::Utils, -# or replaced by something already existing there? -sub _get_component_type_name { - my ( $component, $search_extra) = @_; - $search_extra ||= []; - my @search_extra = map { s/^:://; lc $_ } @$search_extra; - - my @parts = split /::/, $component; - - if (scalar @parts == 1) { - return (undef, $component); - } - - while (my $type = shift @parts) { - return ('controller', join '::', @parts) - if $type =~ /^(c|controller)$/i; - - return ('model', join '::', @parts) - if $type =~ /^(m|model)$/i; - - return ('view', join '::', @parts) - if $type =~ /^(v|view)$/i; - - return (_get_component_type($component), join '::', @parts) - if @search_extra and ( grep { lc $type eq $_ } @search_extra ); - } -} - -sub _get_component_type { - my ( $instance ) = @_; - - return 'controller' if $instance->isa('Catalyst::Controller'); - return 'model' if $instance->isa('Catalyst::Model'); - return 'view' if $instance->isa('Catalyst::View'); -} =head2 $c->locate_components( $setup_component_config ) @@ -2449,9 +2376,7 @@ This method is meant to provide a list of component modules that should be setup for the application. By default, it will use L. Specify a C config option to pass additional options directly -to L. To add additional search paths, specify a key named -C as an array reference. Items in the array beginning with C<::> -will have the application class name prepended to them. +to L. =cut @@ -2460,9 +2385,6 @@ sub locate_components { my $config = shift; my @paths = qw( ::Controller ::C ::Model ::M ::View ::V ); - my $extra = delete $config->{ search_extra } || []; - - push @paths, @$extra; my $locator = Module::Pluggable::Object->new( search_path => [ map { s/^(?=::)/$class/; $_; } @paths ], @@ -2934,12 +2856,6 @@ templates to a different directory. =item * -C - Array reference passed to Module::Pluggable to for additional -namespaces from which components will be loaded (and constructed and stored in -C<< $c->components >>). - -=item * - C - If true, causes internal actions such as C<< _DISPATCH >> to be shown in hit debug tables in the test server.