removed build_root_container()
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Container.pm
index 7e72c86..74f0d6b 100644 (file)
@@ -4,6 +4,8 @@ use Moose;
 use Config::Any;
 use Data::Visitor::Callback;
 use Catalyst::Utils ();
+use MooseX::Types::LoadableClass qw/ LoadableClass /;
+use Catalyst::BlockInjection;
 
 extends 'Bread::Board::Container';
 
@@ -37,29 +39,121 @@ has name => (
     default => 'TestApp',
 );
 
+has sub_container_class => (
+    isa     => LoadableClass,
+    is      => 'ro',
+    coerce  => 1,
+    default => 'Bread::Board::Container',
+);
+
 sub BUILD {
     my $self = shift;
 
-    container $self => as {
-        service name => $self->name;
-        service driver => $self->driver;
-        service file => $self->file;
-        service substitutions => $self->substitutions;
+    $self->${\"build_${_}_service"} for qw/
+        substitutions
+        file
+        driver
+        name
+        prefix
+        extensions
+        path
+        config
+        raw_config
+        global_files
+        local_files
+        global_config
+        local_config
+        config_local_suffix
+        config_path
+    /;
+
+    $self->build_model_subcontainer;
+    $self->build_view_subcontainer;
+    $self->build_controller_subcontainer;
+}
+
+sub build_model_subcontainer {
+    my $self = shift;
+
+    $self->add_sub_container(
+        $self->sub_container_class->new( name => 'model' )
+    );
+}
+
+sub build_view_subcontainer {
+    my $self = shift;
+
+    $self->add_sub_container(
+        $self->sub_container_class->new( name => 'view' )
+    );
+}
+
+sub build_controller_subcontainer {
+    my $self = shift;
+
+    $self->add_sub_container(
+        $self->sub_container_class->new( name => 'controller' )
+    );
+}
 
-        service extensions => (
+sub build_name_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::Literal->new( name => 'name', value => $self->name )
+    );
+}
+
+sub build_driver_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::Literal->new( name => 'driver', value => $self->driver )
+    );
+}
+
+sub build_file_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::Literal->new( name => 'file', value => $self->file )
+    );
+}
+
+sub build_substitutions_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::Literal->new( name => 'substitutions', value => $self->substitutions )
+    );
+}
+
+sub build_extensions_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::BlockInjection->new(
+            name => 'extensions',
             block => sub {
                 return \@{Config::Any->extensions};
             },
-        );
+        )
+    );
+}
 
-        service prefix => (
+sub build_prefix_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::BlockInjection->new(
+            name => 'prefix',
             block => sub {
                 return Catalyst::Utils::appprefix( shift->param('name') );
             },
             dependencies => [ depends_on('name') ],
-         );
+        )
+    );
+}
 
-        service path => (
+sub build_path_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::BlockInjection->new(
+            name => 'path',
             block => sub {
                 my $s = shift;
 
@@ -68,9 +162,15 @@ sub BUILD {
                 || $s->param('name')->path_to( $s->param('prefix') );
             },
             dependencies => [ depends_on('file'), depends_on('name'), depends_on('prefix') ],
-        );
+        )
+    );
+}
 
-        service config => (
+sub build_config_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::BlockInjection->new(
+            name => 'config',
             block => sub {
                 my $s = shift;
 
@@ -84,9 +184,15 @@ sub BUILD {
                 $v->visit( $s->param('raw_config') );
             },
             dependencies => [ depends_on('name'), depends_on('raw_config'), depends_on('substitutions') ],
-        );
+        )
+    );
+}
 
-        service raw_config => (
+sub build_raw_config_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::BlockInjection->new(
+            name => 'raw_config',
             block => sub {
                 my $s = shift;
 
@@ -102,9 +208,15 @@ sub BUILD {
                 return $config;
             },
             dependencies => [ depends_on('global_config'), depends_on('local_config') ],
-        );
+        )
+    );
+}
 
-        service global_files => (
+sub build_global_files_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::BlockInjection->new(
+            name => 'global_files',
             block => sub {
                 my $s = shift;
 
@@ -122,9 +234,15 @@ sub BUILD {
                 return \@files;
             },
             dependencies => [ depends_on('extensions'), depends_on('config_path') ],
-        );
+        )
+    );
+}
 
-        service local_files => (
+sub build_local_files_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::BlockInjection->new(
+            name => 'local_files',
             block => sub {
                 my $s = shift;
 
@@ -144,9 +262,15 @@ sub BUILD {
                 return \@files;
             },
             dependencies => [ depends_on('extensions'), depends_on('config_path'), depends_on('config_local_suffix') ],
-        );
+        )
+    );
+}
 
-        service global_config => (
+sub build_global_config_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::BlockInjection->new(
+            name => 'global_config',
             block => sub {
                 my $s = shift;
 
@@ -158,9 +282,15 @@ sub BUILD {
                 });
             },
             dependencies => [ depends_on('global_files') ],
-        );
+        )
+    );
+}
 
-        service local_config => (
+sub build_local_config_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::BlockInjection->new(
+            name => 'local_config',
             block => sub {
                 my $s = shift;
 
@@ -172,9 +302,15 @@ sub BUILD {
                 });
             },
             dependencies => [ depends_on('local_files') ],
-        );
+        )
+    );
+}
 
-        service config_path => (
+sub build_config_path_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::BlockInjection->new(
+            name => 'config_path',
             block => sub {
                 my $s = shift;
 
@@ -191,9 +327,15 @@ sub BUILD {
                 return [ $path, $extension ];
             },
             dependencies => [ depends_on('prefix'), depends_on('path') ],
-        );
+        )
+    );
+}
 
-        service config_local_suffix => (
+sub build_config_local_suffix_service {
+    my $self = shift;
+    $self->add_service(
+        Bread::Board::BlockInjection->new(
+            name => 'config_local_suffix',
             block => sub {
                 my $s = shift;
                 my $suffix = Catalyst::Utils::env_value( $s->param('name'), 'CONFIG_LOCAL_SUFFIX' ) || $self->config_local_suffix;
@@ -201,9 +343,8 @@ sub BUILD {
                 return $suffix;
             },
             dependencies => [ depends_on('name') ],
-        );
-
-    };
+        )
+    );
 }
 
 sub _fix_syntax {
@@ -248,4 +389,9 @@ sub _config_substitutions {
     return $arg;
 }
 
+sub get_component {
+    my ( $self, $type, $name, $args ) = @_;
+    return $self->get_sub_container($type)->resolve( service => $name, parameters => { context => $args } );
+}
+
 1;