From: André Walker Date: Wed, 1 Jun 2011 02:18:06 +0000 (-0300) Subject: compatibility for the 'components' accessor, made controllers/views/models subs get... X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=f228c263af3f25974ccc3e07840971f70a28a794 compatibility for the 'components' accessor, made controllers/views/models subs get list from the container, and simplified a bit controller/view/model subs --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index f014f29..78ae239 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -548,7 +548,7 @@ sub _comp_names_search_prefixes { my $filter = "^${appclass}::(" . join( '|', @prefixes ) . ')::'; $filter = qr/$filter/; # Compile regex now rather than once per loop - my @components = map { $c->container->get_sub_container($_)->get_service_list } $c->container->get_sub_container_list; + my @components = map { $c->container->get_sub_container($_)->get_service_list } qw(controller view model); # map the original component name to the sub part that we will search against my %eligible = map { my $n = $_; $n =~ s{^$appclass\::[^:]+::}{}; $_ => $n; } @@ -656,7 +656,9 @@ sub controller { if( $name ) { unless ( ref($name) ) { # Direct component hash lookup to avoid costly regexps my $check = $appclass."::Controller::".$name; - return $c->_filter_component( $c->container->get_sub_container('controller')->get_service($check)->get, @args ) if $c->container->get_sub_container('controller')->has_service($check); + my $container = $c->container->get_sub_container('controller'); + return $c->_filter_component( $container->resolve(service => "$check"), @args ) + if $container->has_service($check); } my @result = $c->_comp_search_prefixes( $name, qw/Controller C/ ); return map { $c->_filter_component( $_, @args ) } @result if ref $name; @@ -693,7 +695,9 @@ sub model { if( $name ) { unless ( ref($name) ) { # Direct component hash lookup to avoid costly regexps my $check = $appclass."::Model::".$name; - return $c->_filter_component( $c->container->get_sub_container('model')->get_service($check)->get, @args ) if $c->container->get_sub_container('model')->has_service($check); + my $container = $c->container->get_sub_container('model'); + return $c->_filter_component( $container->resolve(service => "$check"), @args ) + if $container->has_service($check); } my @result = $c->_comp_search_prefixes( $name, qw/Model M/ ); return map { $c->_filter_component( $_, @args ) } @result if ref $name; @@ -751,9 +755,10 @@ sub view { if( $name ) { unless ( ref($name) ) { # Direct component hash lookup to avoid costly regexps my $check = $appclass."::View::".$name; - if ($c->container->get_sub_container('view')->has_service($check)) { + my $container = $c->container->get_sub_container('view'); + if ($container->has_service($check)) { - return $c->_filter_component( $c->container->get_sub_container('view')->get_service($check)->get, @args ); + return $c->_filter_component( $container->get_service($check)->get, @args ); } else { $c->log->warn( "Attempted to use view '$check', but does not exist" ); @@ -794,7 +799,7 @@ Returns the available names which can be passed to $c->controller sub controllers { my ( $c ) = @_; - return $c->_comp_names(qw/Controller C/); + return $c->container->get_sub_container('controller')->get_service_list; } =head2 $c->models @@ -805,7 +810,7 @@ Returns the available names which can be passed to $c->model sub models { my ( $c ) = @_; - return $c->_comp_names(qw/Model M/); + return $c->container->get_sub_container('model')->get_service_list; } @@ -817,7 +822,7 @@ Returns the available names which can be passed to $c->view sub views { my ( $c ) = @_; - return $c->_comp_names(qw/View V/); + return $c->container->get_sub_container('view')->get_service_list; } =head2 $c->comp($name) @@ -1590,6 +1595,34 @@ These methods are not meant to be used by end users. Returns a hash of components. +=cut + +around components => sub { + my $orig = shift; + my $class = shift; + my $comps = shift; + + return $class->$orig if ( !$comps ); + + $class->setup_config unless defined $class->container; + +# should there be a warning here, not to use this accessor to create the components? + my $components = {}; + + my $containers; + $containers->{$_} = $class->container->get_sub_container($_) for qw(model view controller); + + for my $component ( keys %$comps ) { + $components->{ $component } = $comps->{$component}; + + my $type = _get_component_type($component); + + $containers->{$type}->add_service(Bread::Board::BlockInjection->new( name => $component, block => sub { return $class->setup_component($component) } )); + } + + return $class->$orig($components); +}; + =head2 $c->context_class Returns or sets the context class. @@ -2483,13 +2516,9 @@ sub setup_components { for my $component (@comps) { my $instance = $class->components->{ $component } = $class->setup_component($component); - my $type = lc((split /::/, $component)[1]); - if ($deprecatedcatalyst_component_names) { - $type = 'controller' if $type eq 'c'; - $type = 'model' if $type eq 'm'; - $type = 'view' if $type eq 'v'; + if ( my $type = _get_component_type($component) ) { + $containers->{$type}->add_service(Bread::Board::BlockInjection->new( name => $component, block => sub { return $instance } )); } - $containers->{$type}->add_service(Bread::Board::BlockInjection->new( name => $component, block => sub { return $instance } )); my @expanded_components = $instance->can('expand_modules') ? $instance->expand_modules( $component, $config ) : $class->expand_component_module( $component, $config ); @@ -2501,18 +2530,26 @@ sub setup_components { qq{Please switch your class names to ::Model::, ::View:: and ::Controller: as appropriate.\n} ) if $deprecatedcatalyst_component_names; - if ($deprecatedcatalyst_component_names) { - $type = lc((split /::/, $component)[1]); - $type = 'controller' if $type eq 'c'; - $type = 'model' if $type eq 'm'; - $type = 'view' if $type eq 'v'; + if (my $type = _get_component_type($component)) { + $containers->{$type}->add_service(Bread::Board::BlockInjection->new( name => $component, block => sub { return $class->setup_component($component) } )); } - $containers->{$type}->add_service(Bread::Board::BlockInjection->new( name => $component, block => sub { return $class->setup_component($component) } )); + $class->components->{ $component } = $class->setup_component($component); } } } +sub _get_component_type { + my $component = shift; + my @parts = split /::/, $component; + + for (@parts) { + return 'controller' if /c|controller/i; + return 'model' if /m|model/i; + return 'view' if /v|view/i; + } +} + =head2 $c->locate_components( $setup_component_config ) This method is meant to provide a list of component modules that should be diff --git a/lib/Catalyst/Container.pm b/lib/Catalyst/Container.pm index 58a2702..5b4db4d 100644 --- a/lib/Catalyst/Container.pm +++ b/lib/Catalyst/Container.pm @@ -150,16 +150,12 @@ sub BUILD { block => sub { my $s = shift; - my @files = @{$s->param('global_files')}; - - my $cfg = Config::Any->load_files({ - files => \@files, + return Config::Any->load_files({ + files => $s->param('global_files'), filter => \&_fix_syntax, use_ext => 1, driver_args => $s->param('driver'), }); - - return $cfg; }, dependencies => [ depends_on('global_files') ], ); @@ -168,16 +164,12 @@ sub BUILD { block => sub { my $s = shift; - my @files = @{$s->param('local_files')}; - - my $cfg = Config::Any->load_files({ - files => \@files, + return Config::Any->load_files({ + files => $s->param('local_files'), filter => \&_fix_syntax, use_ext => 1, driver_args => $s->param('driver'), }); - - return $cfg; }, dependencies => [ depends_on('local_files') ], ); @@ -234,7 +226,7 @@ sub _fix_syntax { } sub _config_substitutions { - my ($self, $name, $subs) = (shift, shift, shift); + my ($self, $name, $subs) = @_; $subs->{ HOME } ||= sub { shift->path_to( '' ); }; $subs->{ ENV } ||=