ConstructorInjection now depends on the application, not the application_name
[catagits/Catalyst-Runtime.git] / lib / Catalyst / IOC / ConstructorInjection.pm
index 82e3450..392d2b7 100644 (file)
@@ -1,39 +1,54 @@
 package Catalyst::IOC::ConstructorInjection;
 use Moose;
+use Bread::Board::Dependency;
 use Try::Tiny;
 use Catalyst::Utils ();
+
 extends 'Bread::Board::ConstructorInjection';
 
-with 'Bread::Board::Service::WithClass',
-     'Bread::Board::Service::WithParameters',
-     'Bread::Board::Service::WithDependencies';
+sub BUILD {
+    my $self = shift;
+    $self->add_dependency(
+        __catalyst_config => Bread::Board::Dependency->new(
+            service_path => '/config'
+        )
+    );
+}
+
+has catalyst_component_name => (
+    is => 'ro',
+);
 
 has config => (
+    init_arg   => undef,
     is         => 'ro',
     isa        => 'HashRef',
-    required => 1,
+    writer     => '_set_config',
+    clearer    => '_clear_config',
 );
 
+around resolve_dependencies => sub {
+    my ($orig, $self, @args) = @_;
+    my %deps = $self->$orig(@args);
+    my $app_config = delete $deps{__catalyst_config};
+    my $conf_key = Catalyst::Utils::class2classsuffix($self->catalyst_component_name);
+    $self->_set_config($app_config->{$conf_key} || {});
+    return %deps;
+};
+
 sub get {
     my $self = shift;
-
     my $component   = $self->class;
-    my %config = (%{ $self->config }, %{ $self->params });
 
-    # FIXME - Is depending on the application name to pass into constructors here a good idea?
-    #         This makes app/ctx split harder I think.. Need to think more here, but I think
-    #         we want to pass the application in as a parameter when building the service
-    #         rather than depending on the app name, so that later, when the app becomes an instance
-    #         then it'll get passed in, and components can stash themselves 'per app instance'
-    my $app_name    = $self->param('application_name');
+    my $params = $self->params;
+    my %config = (%{ $self->config || {} }, %{ $params });
+    $self->_clear_config;
+
+    my $app_name = $self->param('application');
 
     # Stash catalyst_component_name in the config here, so that custom COMPONENT
-    # methods also pass it. local to avoid pointlessly shitting in config
-    # for the debug screen, as $component is already the key name.
-    # XXX FIXME - WRONG!!! MyApp::Model::Foo may be an instance of something
-    #             totally diferent, ergo it should get a catalyst_component_name
-    #             of MyApp::Model::Foo.. Write failing tests for this in master?
-    $config{catalyst_component_name} = $component;
+    # methods also pass it.
+    $config{catalyst_component_name} = $self->catalyst_component_name;
 
     unless ( $component->can( 'COMPONENT' ) ) {
         # FIXME - make some deprecation warnings