X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FIOC%2FContainer.pm;h=880fa96b26011e439e1e142926322c014b18f57e;hb=ced6f9e2e0e0b6e04249634b1ce8455bba9aa959;hp=4c99cd8b15fa7c6892ff835de74c682b67ae0a42;hpb=b844dcad30802f3eca6074b64661db0805cb5511;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/IOC/Container.pm b/lib/Catalyst/IOC/Container.pm index 4c99cd8..880fa96 100644 --- a/lib/Catalyst/IOC/Container.pm +++ b/lib/Catalyst/IOC/Container.pm @@ -4,6 +4,7 @@ use Moose; use Config::Any; use Data::Visitor::Callback; use Catalyst::Utils (); +use List::Util qw(first); use Devel::InnerPackage (); use Hash::Util qw/lock_hash/; use MooseX::Types::LoadableClass qw/ LoadableClass /; @@ -82,6 +83,16 @@ sub BUILD { my $config = $self->resolve( service => 'config' ); + # don't force default_component to be undef if the config wasn't set + my @default_view = $config->{default_view} + ? ( default_component => $config->{default_view} ) + : ( ) + ; + my @default_model = $config->{default_model} + ? ( default_component => $config->{default_model} ) + : ( ) + ; + $self->add_sub_container( $self->build_component_subcontainer ); @@ -91,15 +102,11 @@ sub BUILD { ); $self->add_sub_container( - $self->build_view_subcontainer( - default_component => $config->{default_view}, - ) + $self->build_view_subcontainer( @default_view ) ); $self->add_sub_container( - $self->build_model_subcontainer( - default_component => $config->{default_model}, - ) + $self->build_model_subcontainer( @default_model ) ); } @@ -472,9 +479,6 @@ sub setup_components { unless $comps{$component}; } } - - $self->get_sub_container('model')->make_single_default; - $self->get_sub_container('view')->make_single_default; } sub _fix_syntax { @@ -578,7 +582,7 @@ sub find_component { } # one last search for things like $c->comp(qr/::M::/) - @result = $self->find_component_regexp( + @result = $self->_find_component_regexp( $component, @args ) if !@result and ref $component; @@ -586,7 +590,7 @@ sub find_component { return @result; } -sub find_component_regexp { +sub _find_component_regexp { my ( $self, $component, @args ) = @_; my @result; @@ -603,37 +607,23 @@ sub find_component_regexp { return @result; } -# FIXME - t0m, how do you feel about this name? -# also, do you think I should draw it here, or just return the data structure? -sub get_components_names_types { - my ( $self ) = @_; - my @comps_names_types; - - for my $sub_container_name (qw/model view controller/) { - my $sub_container = $self->get_sub_container($sub_container_name); - for my $service ( $sub_container->get_service_list ) { - my $comp = $sub_container->resolve(service => $service); - my $compname = ref $comp || $comp; - my $type = ref $comp ? 'instance' : 'class'; - push @comps_names_types, [ $compname, $type ]; - } - } - - return @comps_names_types; -} - sub get_all_components { my $self = shift; my %components; - my $container = $self->get_sub_container('component'); + foreach my $type (qw/model view controller /) { + my $container = $self->get_sub_container('component'); - for my $component ($container->get_service_list) { - my $comp = $container->resolve( - service => $component - ); - my $comp_name = ref $comp || $comp; - $components{$comp_name} = $comp; + for my $component ($container->get_service_list) { + my $comp = $container->resolve( + service => $component + ); + my $comp_name = ref $comp || $comp; # THIS IS WRONG! :) + # Just as it is called Model::Foo + # does not mean it has to be + # an instance of model::foo + $components{$comp_name} = $comp; + } } return lock_hash %components; @@ -686,21 +676,16 @@ sub add_component { # or replaced by something already existing there? sub _get_component_type_name { my ( $component ) = @_; + my $result; - my @parts = split /::/, $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; + while ( !$result and (my $index = index $component, '::') > 0 ) { + my $type = lc substr $component, 0, $index; + $component = substr $component, $index + 2; + $result = first { $type eq $_ or $type eq substr($_, 0, 1) } + qw{ model view controller }; } - return (undef, $component); + return ($result, $component); } sub expand_component_module { @@ -745,8 +730,7 @@ Same as L, but for views. =head2 build_controller_subcontainer -Same as L, but for controllers. The difference is -that there is no ACCEPT_CONTEXT for controllers. +Same as L, but for controllers. =head1 Building Services @@ -782,12 +766,14 @@ C<__DATA__> as a config value, for example) The parameter list is split on comma (C<,>). You can override this method to do your own string munging, or you can define your own macros in -Cconfig-E{ 'Plugin::ConfigLoader' }-E{ substitutions }>. +C<< config( 'Plugin::ConfigLoader' => { substitutions => { ... } } ) >>. Example: - MyApp->config->{ 'Plugin::ConfigLoader' }->{ substitutions } = { - baz => sub { my $c = shift; qux( @_ ); } - } + MyApp->config( 'Plugin::ConfigLoader' => { + substitutions => { + baz => sub { my $c = shift; qux( @_ ); }, + }, + }); The above will respond to C<__baz(x,y)__> in config strings. @@ -880,12 +866,6 @@ default component (such as default_view, if $sub_container is 'view'). If $name is a regexp, it returns an array of matching components. Otherwise, it looks for the component with name $name. -=head2 get_components_names_types - -Gets all components from all containers and returns them as an array of -arrayrefs containing the component name and the component type (i.e., whether -it's an instance or a class). - =head2 get_all_components Fetches all the components, in each of the sub_containers model, view and @@ -902,12 +882,8 @@ by the component name given. Searches for components in all containers. If $component is the full class name, the subcontainer is guessed, and it gets the searched component in there. Otherwise, it looks for a component with that name in all subcontainers. If -$component is a regexp, it calls the method below, find_component_regexp, -and matches all components against that regexp. - -=head2 find_component_regexp - -Finds components that match a given regexp. Used internally, by find_component. +$component is a regexp it calls _find_component_regexp and matches all +components against that regexp. =head2 expand_component_module