FIXME's and comments
[catagits/Catalyst-Runtime.git] / lib / Catalyst / IOC / Container.pm
index 3359ec9..20ea288 100644 (file)
@@ -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 /;
@@ -442,6 +443,7 @@ sub build_locate_components_service {
 
 sub setup_components {
     my $self = shift;
+    warn("Setting up default components");
     my $class = $self->resolve( service => 'application_name' );
     my @comps = @{ $self->resolve( service => 'locate_components' ) };
     my %comps = map { $_ => 1 } @comps;
@@ -581,7 +583,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;
 
@@ -589,7 +591,7 @@ sub find_component {
     return @result;
 }
 
-sub find_component_regexp {
+sub _find_component_regexp {
     my ( $self, $component, @args ) = @_;
     my @result;
 
@@ -610,14 +612,33 @@ sub get_all_components {
     my $self = shift;
     my %components;
 
-    my $container = $self->get_sub_container('component');
+    # FIXME - if we're getting from these containers, we need to either:
+    #   - pass 'ctx' and 'accept_context_args' OR
+    #   - make these params optional
+    foreach my $type (qw/model view controller /) {
+        my $container = $self->get_sub_container($type);
 
-    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
+            # (AndrĂ©'s answer)
+            # t0m, you're absolutely right, I really hadn't thought about it.
+            # But then, we have a problem: suppose there is a component called
+            # MyApp::M::Foo, for instance. The service name would be 'Foo',
+            # and it would be stored in the 'model' sub container. So we have
+            # $app_name . '::' . uc_first($type) . '::' . $service_name
+            # that would return MyApp::Model::Foo. It would get really, really
+            # ugly to check MyApp::M::Foo. So, either we change the hash key,
+            # or we drop support for ::[CMV]::, or I don't know, maybe you
+            # have a better solution? :)
+
+            $components{$comp_name} = $comp;
+        }
     }
 
     return lock_hash %components;
@@ -642,11 +663,11 @@ sub add_component {
     $instance_container->add_service(
         Catalyst::IOC::ConstructorInjection->new(
             name      => $component_service_name,
+            catalyst_component_name => $component,
             class     => $component,
             lifecycle => 'Singleton',
             dependencies => [
                 depends_on( '/application_name' ),
-                depends_on( '/config' ),
             ],
         )
     ) unless $instance_container->has_service( $component_service_name );
@@ -670,23 +691,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 (scalar @parts > 1) {
-        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 {
@@ -694,19 +708,6 @@ sub expand_component_module {
     return Devel::InnerPackage::list_packages( $module );
 }
 
-# copied from stevan's OX
-sub flush_request_services {
-    my $self = shift;
-    my @services = $self->get_service_list;
-
-    foreach my $service (@services) {
-        my $injection = $self->get_service($service);
-        if ($injection->does('Catalyst::IOC::LifeCycle::Request')) {
-            $injection->flush_instance;
-        }
-    }
-}
-
 1;
 
 __END__
@@ -880,12 +881,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,20 +897,14 @@ 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
 
 Components found by C<locate_components> will be passed to this method, which
 is expected to return a list of component (package) names to be set up.
 
-=head2 flush_request_services
-
 =head2 setup_components
 
 =head1 AUTHORS