From: John Napiorkowski Date: Fri, 17 Apr 2015 18:25:25 +0000 (-0500) Subject: allow inject_components application level method X-Git-Tag: 5.90089_002~3 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=067a21ea868757ad0d3ea1d4e80f74d61e0698fc;hp=ca6d4ff660abd0bc8cd2e6590a5d8c76a5cae64a allow inject_components application level method --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index c50bc0f..545ec83 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -2872,6 +2872,65 @@ sub setup_components { } } +=head2 $app->inject_components($MyApp_Component_name => \%args); + +Add a component that is injected at setup: + + MyApp->inject_component( 'Model::Foo' => { from_component => 'Common::Foo' } ); + +Must be called before ->setup. Expects a component name for your +current application and \%args where + +=over 4 + +=item from_component + +The target component being injected into your application + +=item roles + +An arrayref of Ls that are applied to your component. + +=back + +Example + + MyApp->inject_component( + 'Model::Foo' => { + from_component => 'Common::Model::Foo', + roles => ['Role1', 'Role2'], + }); + +=head2 $app->inject_components + +Inject a list of components: + + MyApp->inject_components( + 'Model::FooOne' => { + from_component => 'Common::Model::Foo', + roles => ['Role1', 'Role2'], + }, + 'Model::FooTwo' => { + from_component => 'Common::Model::Foo', + roles => ['Role1', 'Role2'], + }); + +=cut + +sub inject_component { + my ($app, $name, $args) = @_; + die "Component $name exists" if + $app->config->{inject_components}->{$name}; + $app->config->{inject_components}->{$name} = $args; +} + +sub inject_components { + my $app = shift; + while(@_) { + $app->inject_component(shift, shift); + } +} + =head2 $c->locate_components( $setup_component_config ) This method is meant to provide a list of component modules that should be diff --git a/t/configured_comps.t b/t/configured_comps.t index cfd4aea..445b647 100644 --- a/t/configured_comps.t +++ b/t/configured_comps.t @@ -73,6 +73,8 @@ use Test::More; Test::More::ok(my $user = $c->model("User")->find($int)); Test::More::is($c->model("User")->zoo->a, 2); Test::More::is($c->model("Foo")->role, 'role'); + Test::More::is($c->model("One")->a, 'one'); + Test::More::is($c->model("Two")->a, 'two'); $c->res->body("name: $user->{name}, age: $user->{age}"); } @@ -87,6 +89,11 @@ use Test::More; package MyApp; use Catalyst; + MyApp->inject_components( + 'Model::One' => { from_component => 'Local::Model::Foo' }, + 'Model::Two' => { from_component => 'Local::Model::Foo' }, + ); + MyApp->config({ inject_components => { 'Controller::Err' => { from_component => 'Local::Controller::Errors' }, @@ -96,6 +103,9 @@ use Test::More; 'Controller::Err' => { a => 100, b=>200, namespace=>'error' }, 'Model::Zoo' => { a => 2 }, 'Model::Foo' => { a => 100 }, + 'Model::One' => { a => 'one' }, + 'Model::Two' => { a => 'two' }, + }); MyApp->setup;