class level config merged with container's config
André Walker [Fri, 29 Jul 2011 22:15:26 +0000 (19:15 -0300)]
lib/Catalyst.pm
lib/Catalyst/IOC/Container.pm

index 1c3043f..65bc1dc 100644 (file)
@@ -2281,17 +2281,17 @@ sub setup_actions { my $c = shift; $c->dispatcher->setup_actions( $c, @_ ) }
 sub setup_config {
     my $class = shift;
 
-    my %args = %{ $class->config || {} };
+    my $args = $class->config || {};
 
     my @container_classes = ( "${class}::Container", 'Catalyst::IOC::Container');
-    unshift @container_classes, delete $args{container_class} if exists $args{container_class};
+    unshift @container_classes, delete $args->{container_class} if exists $args->{container_class};
 
     my $container_class = Class::MOP::load_first_existing_class(@container_classes);
 
-    my $container = $container_class->new( %args, application_name => "$class", name => "$class" );
+    my $container = $container_class->new( application_name => "$class", name => "$class" );
     $class->container($container);
 
-    my $config = $container->resolve(service => 'config');
+    my $config = $container->resolve( service => 'config' );
     $class->config($config);
     $class->finalize_config; # back-compat
 }
index 24d4c93..28a38a4 100644 (file)
@@ -73,29 +73,27 @@ sub BUILD {
         local_files
         global_config
         local_config
+        class_config
         config_local_suffix
         config_path
         locate_components
     /;
 
+    my $config = $self->resolve( service => 'config' );
+
     $self->add_sub_container(
         $self->build_controller_subcontainer
     );
 
-    # FIXME - the config should be merged at this point
-    my $config        = $self->resolve( service => 'config' );
-    my $default_view  = $params->{default_view}  || $config->{default_view};
-    my $default_model = $params->{default_model} || $config->{default_model};
-
     $self->add_sub_container(
         $self->build_view_subcontainer(
-            default_component => $default_view,
+            default_component => $config->{default_view},
         )
     );
 
     $self->add_sub_container(
         $self->build_model_subcontainer(
-            default_component => $default_model,
+            default_component => $config->{default_model},
         )
     );
 }
@@ -224,15 +222,17 @@ sub build_raw_config_service {
             my @global = @{$s->param('global_config')};
             my @locals = @{$s->param('local_config')};
 
-            my $config = {};
+            my $config = $s->param('class_config');
+
             for my $cfg (@global, @locals) {
                 for (keys %$cfg) {
                     $config = Catalyst::Utils::merge_hashes( $config, $cfg->{$_} );
                 }
             }
+
             return $config;
         },
-        dependencies => [ depends_on('global_config'), depends_on('local_config') ],
+        dependencies => [ depends_on('global_config'), depends_on('local_config'), depends_on('class_config') ],
     );
 }
 
@@ -290,6 +290,26 @@ sub build_local_files_service {
     );
 }
 
+sub build_class_config_service {
+    my $self = shift;
+
+    return Bread::Board::BlockInjection->new(
+        lifecycle => 'Singleton',
+        name => 'class_config',
+        block => sub {
+            my $s   = shift;
+            my $app = $s->param('application_name');
+
+            # Container might be called outside Catalyst context
+            return {} unless Class::MOP::is_class_loaded($app);
+
+            # config might not have been defined
+            return $app->config || {};
+        },
+        dependencies => [ depends_on('application_name') ],
+    );
+}
+
 sub build_global_config_service {
     my $self = shift;