X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst.pm;h=545ec839e8c1243a1a3fab02e52a2a7f455c60f3;hp=851ff1db396992a53ec4007b70152aaee53647a5;hb=067a21ea868757ad0d3ea1d4e80f74d61e0698fc;hpb=e39312ba37f13fad13d7f1acf967e40dea096278 diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 851ff1d..545ec83 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -718,7 +718,7 @@ sub _filter_component { # die "Circular Dependencies Detected." if $tracker{$comp}; # $tracker{$comp}++; if(ref $comp eq 'CODE') { - $comp = $comp->(); + $comp = $comp->($c); } #$tracker{$comp}++; @@ -2849,35 +2849,86 @@ 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 $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 )