# 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 )
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' }
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}");
}
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;