created attribute for the container class that will be used for subcontainers
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Container.pm
index 5b4db4d..2e885e3 100644 (file)
@@ -4,6 +4,7 @@ use Moose;
 use Config::Any;
 use Data::Visitor::Callback;
 use Catalyst::Utils ();
+use MooseX::Types::LoadableClass qw/ LoadableClass /;
 
 extends 'Bread::Board::Container';
 
@@ -37,29 +38,125 @@ 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_root_container;
+
+    $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' )
+    );
+}
+
+sub build_root_container {
+    my $self = shift;
+
+    $self->build_substitutions_service();
+    $self->build_file_service();
+    $self->build_driver_service();
+    $self->build_name_service();
+    $self->build_prefix_service();
+    $self->build_extensions_service();
+    $self->build_path_service();
+    $self->build_config_service();
+    $self->build_raw_config_service();
+    $self->build_global_files_service();
+    $self->build_local_files_service();
+    $self->build_global_config_service();
+    $self->build_local_config_service();
+    $self->build_config_local_suffix_service();
+    $self->build_config_path_service();
+}
+
+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 )
+    );
+}
 
-        service extensions => (
+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 +165,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 +187,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 +211,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 +237,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,12 +265,18 @@ 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;
+
                 return Config::Any->load_files({
                     files       => $s->param('global_files'),
                     filter      => \&_fix_syntax,
@@ -158,9 +285,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 +305,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 +330,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 +346,8 @@ sub BUILD {
                 return $suffix;
             },
             dependencies => [ depends_on('name') ],
-        );
-
-    };
+        )
+    );
 }
 
 sub _fix_syntax {
@@ -226,7 +370,7 @@ sub _fix_syntax {
 }
 
 sub _config_substitutions {
-    my ($self, $name, $subs) = @_;
+    my ( $self, $name, $subs, $arg ) = @_;
 
     $subs->{ HOME } ||= sub { shift->path_to( '' ); };
     $subs->{ ENV } ||=
@@ -244,11 +388,8 @@ sub _config_substitutions {
     $subs->{ literal } ||= sub { return $_[ 1 ]; };
     my $subsre = join( '|', keys %$subs );
 
-    for ( @_ ) {
-        my $arg = $_;
-        $arg =~ s{__($subsre)(?:\((.+?)\))?__}{ $subs->{ $1 }->( $name, $2 ? split( /,/, $2 ) : () ) }eg;
-        return $arg;
-    }
+    $arg =~ s{__($subsre)(?:\((.+?)\))?__}{ $subs->{ $1 }->( $name, $2 ? split( /,/, $2 ) : () ) }eg;
+    return $arg;
 }
 
 1;