moved temporarily _get_component_type_name to Container
[catagits/Catalyst-Runtime.git] / lib / Catalyst / IOC / Container.pm
index 11239e4..f332cb8 100644 (file)
@@ -4,6 +4,7 @@ use Moose;
 use Config::Any;
 use Data::Visitor::Callback;
 use Catalyst::Utils ();
+use Hash::Util qw/lock_hash/;
 use MooseX::Types::LoadableClass qw/ LoadableClass /;
 use Catalyst::IOC::BlockInjection;
 use namespace::autoclean;
@@ -431,9 +432,14 @@ sub get_component_from_sub_container {
 }
 
 sub find_component {
-    my ( $self, $component, @args ) = @_;
+    my ( $self, $component, $c, @args ) = @_;
+    my ( $type, $name ) = _get_component_type_name($component);
     my @result;
 
+    return $self->get_component_from_sub_container(
+        $type, $name, $c, @args
+    ) if $type;
+
     my $query = ref $component
               ? $component
               : qr{^$component$}
@@ -444,10 +450,15 @@ sub find_component {
         my @components   = $subcontainer->get_service_list;
         @result          = grep { m{$component} } @components;
 
-        return map { $subcontainer->get_component( $_, @args ) } @result
+        return map { $subcontainer->get_component( $_, $c, @args ) } @result
             if @result;
     }
 
+    # one last search for things like $c->comp(qr/::M::/)
+    @result = $self->find_component_regexp(
+        $c->components, $component, $c, @args
+    ) if !@result and ref $component;
+
     # it expects an empty list on failed searches
     return @result;
 }
@@ -459,9 +470,7 @@ sub find_component_regexp {
     my @components = grep { m{$component} } keys %{ $components };
 
     for (@components) {
-        # FIXME this is naughty enough being called inside Catalyst.pm
-        # find some alternative for this sub and remember to delete here
-        my ($type, $name) = Catalyst::_get_component_type_name($_);
+        my ($type, $name) = _get_component_type_name($_);
 
         push @result, $self->get_component_from_sub_container(
             $type, $name, @args
@@ -471,6 +480,7 @@ sub find_component_regexp {
     return @result;
 }
 
+# FIXME sorry for the name again :)
 sub get_components_types {
     my ( $self ) = @_;
     my @comps_types;
@@ -488,6 +498,65 @@ sub get_components_types {
     return @comps_types;
 }
 
+sub get_all_components {
+    my $self = shift;
+    my %components;
+
+    my $containers = {
+        map { $_ => $self->get_sub_container($_) } qw(model view controller)
+    };
+
+    for my $container (keys %$containers) {
+        for my $component ($containers->{$container}->get_service_list) {
+            my $comp = $containers->{$container}->resolve(
+                service => $component
+            );
+            my $comp_name = ref $comp || $comp;
+            $components{$comp_name} = $comp;
+        }
+    }
+
+    return lock_hash %components;
+}
+
+sub add_component {
+# FIXME I'm aware it shouldn't be getting $instance as an argument
+# and that setup_component should be removed. This is temporary
+    my ( $self, $component, $instance ) = @_;
+    my ( $type, $name ) = _get_component_type_name($component);
+
+    return unless $type;
+
+    $self->get_sub_container($type)->add_service(
+        Catalyst::IOC::BlockInjection->new(
+            name  => $name,
+            block => sub { $instance },
+        )
+    );
+}
+
+# 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 ) = @_;
+
+    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;
+    }
+
+    return (undef, $component);
+}
+
 1;
 
 __END__
@@ -538,6 +607,12 @@ Catalyst::Container - IOC for Catalyst components
 
 =head2 get_component_from_sub_container
 
+=head2 get_components_types
+
+=head2 get_all_components
+
+=head2 add_component
+
 =head2 find_component
 
 =head2 find_component_regexp