From: John Napiorkowski Date: Fri, 17 Apr 2015 17:29:50 +0000 (-0500) Subject: new config key for injected comps X-Git-Tag: 5.90089_002~5 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=58ece1eaaafa14d3ece3b4d579690162c2ebc8b2 new config key for injected comps --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 859df2a..c50bc0f 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -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 ) diff --git a/t/configured_comps.t b/t/configured_comps.t index 8a84fd6..cfd4aea 100644 --- a/t/configured_comps.t +++ b/t/configured_comps.t @@ -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;