new config key for injected comps
John Napiorkowski [Fri, 17 Apr 2015 17:29:50 +0000 (12:29 -0500)]
lib/Catalyst.pm
t/configured_comps.t

index 859df2a..c50bc0f 100644 (file)
@@ -2849,35 +2849,27 @@ sub setup_components {
     # Inject a component or wrap a stand alone class in an adaptor. This makes a list
     # of named components in the configuration that are not actually existing (not a
     # real file).
-    my @configured_comps = grep { not($class->components->{$_}||'') }
-      grep { /^(Model)::|(View)::|(Controller::)/ }
-        keys %{$class->config ||+{}};
-
-    foreach my $configured_comp(@configured_comps) {
-      my $component_class = exists $class->config->{$configured_comp}->{from_component} ? 
-        delete $class->config->{$configured_comp}->{from_component} : '';
 
+    my @injected_components = keys %{$class->config->{inject_components} ||+{}};
+    foreach my $injected_comp_name(@injected_components) {
+      my $component_class = $class->config->{inject_components}->{$injected_comp_name}->{from_component} || '';
       if($component_class) {
-        my @roles = @{ exists $class->config->{$configured_comp}->{roles} ?
-          delete $class->config->{$configured_comp}->{roles} : [] };
-
-        my %args = %{ exists $class->config->{$configured_comp}->{args} ? 
-          delete $class->config->{$configured_comp}->{args} : +{} };
+        my @roles = @{$class->config->{inject_components}->{$injected_comp_name}->{roles} ||[]};
+        my %args = %{ $class->config->{$injected_comp_name} || +{} };
 
-        $class->config->{$configured_comp} = \%args;
         Catalyst::Utils::inject_component(
           into => $class,
           component => $component_class,
           (scalar(@roles) ? (traits => \@roles) : ()),
-          as => $configured_comp);
+          as => $injected_comp_name);
       }
     }
 
     # All components are registered, now we need to 'init' them.
     foreach my $component_name (keys %{$class->components||{}}) {
-      $class->components->{$component_name} = $class->components->{$component_name}->();
+      $class->components->{$component_name} = $class->components->{$component_name}->() if
+      (ref($class->components->{$component_name}) || '') eq 'CODE';
     }
-
 }
 
 =head2 $c->locate_components( $setup_component_config )
index 8a84fd6..cfd4aea 100644 (file)
@@ -4,12 +4,19 @@ use HTTP::Request::Common;
 use Test::More;
 
 {
+  package TestRole;
+
+  use Moose::Role;
+
+  sub role { 'role' }
+  
   package Local::Model::Foo;
 
   use Moose;
   extends 'Catalyst::Model';
 
   has a => (is=>'ro', required=>1);
+  has b => (is=>'ro');
 
   sub foo { shift->a . 'foo' }
 
@@ -64,8 +71,9 @@ use Test::More;
     my ($self, $c, $int) = @_;
     
     Test::More::ok(my $user = $c->model("User")->find($int));
-    Test::More::ok($c->model("User")->zoo->a);
-    
+    Test::More::is($c->model("User")->zoo->a, 2);
+    Test::More::is($c->model("Foo")->role, 'role');
+   
     $c->res->body("name: $user->{name}, age: $user->{age}");
   }
 
@@ -80,18 +88,14 @@ use Test::More;
   use Catalyst;
 
   MyApp->config({
-    'Controller::Err' => {
-      from_component => 'Local::Controller::Errors',
-      args => { a=> 100, b => 200, namespace =>'error' },
-    },
-    'Model::Zoo' => {
-      from_component => 'Local::Model::Foo',
-      args => { a=>2 },
-    },
-    'Model::Foo' => {
-      from_component => 'Local::Model::Foo',
-      args => { a=> 100 },
+    inject_components => {
+      'Controller::Err' => { from_component => 'Local::Controller::Errors' },
+      'Model::Zoo' => { from_component => 'Local::Model::Foo' },
+      'Model::Foo' => { from_component => 'Local::Model::Foo', roles => ['TestRole'] },
     },
+    'Controller::Err' => { a => 100, b=>200, namespace=>'error' },
+    'Model::Zoo' => { a => 2 },
+    'Model::Foo' => { a => 100 },
   });
 
   MyApp->setup;