From: André Walker Date: Wed, 6 Jul 2011 23:12:26 +0000 (-0300) Subject: Merging of gsoc_breadboard X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=3b5e3e55edd97e6bb3218d62fab05ac1bbeeacd4;hp=56cf18648867ed69585864babff6956b3b630cb7;p=catagits%2FCatalyst-Runtime.git Merging of gsoc_breadboard --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 60d8a3c..15181e3 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -2373,7 +2373,7 @@ sub setup_config { $class->finalize_config; # back-compat } -=head $c->finalize_config +=head2 $c->finalize_config =cut diff --git a/lib/Catalyst/BlockInjection.pm b/lib/Catalyst/BlockInjection.pm index b3177f8..17a77fe 100644 --- a/lib/Catalyst/BlockInjection.pm +++ b/lib/Catalyst/BlockInjection.pm @@ -9,3 +9,22 @@ __PACKAGE__->meta->make_immutable; no Moose; 1; + +__END__ + +=pod + +=head1 NAME + +Catalyst::BlockInjection + +=head1 AUTHOR + +André Walker + +=head1 LICENSE + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/lib/Catalyst/Container.pm b/lib/Catalyst/Container.pm index 85ccc22..e25fc5c 100644 --- a/lib/Catalyst/Container.pm +++ b/lib/Catalyst/Container.pm @@ -46,311 +46,372 @@ has sub_container_class => ( default => 'Catalyst::SubContainer', ); +=head1 NAME + +Catalyst::Container - IOC for Catalyst components + +=head1 METHODS + +=cut + sub BUILD { my $self = shift; - $self->build_root_container; + $self->add_service( + $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; + $self->add_sub_container( + $self->${ \"build_${_}_subcontainer" } + ) for qw/ model view controller /; } +=head2 build_model_subcontainer + +=cut + sub build_model_subcontainer { my $self = shift; - $self->add_sub_container( - $self->sub_container_class->new( name => 'model' ) - ); + return $self->sub_container_class->new( name => 'model' ); } +=head2 build_view_subcontainer + +=cut + sub build_view_subcontainer { my $self = shift; - $self->add_sub_container( - $self->sub_container_class->new( name => 'view' ) - ); + return $self->sub_container_class->new( name => 'view' ); } +=head2 build_controller_subcontainer + +=cut + sub build_controller_subcontainer { my $self = shift; - $self->add_sub_container( - $self->sub_container_class->new( name => 'controller' ) - ); + return $self->sub_container_class->new( name => 'controller' ); } -sub build_root_container { - my $self = shift; +=head2 build_name_service - $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(); -} +=cut sub build_name_service { my $self = shift; - $self->add_service( - Bread::Board::Literal->new( name => 'name', value => $self->name ) - ); + + return Bread::Board::Literal->new( name => 'name', value => $self->name ); } +=head2 build_driver_service + +=cut + sub build_driver_service { my $self = shift; - $self->add_service( - Bread::Board::Literal->new( name => 'driver', value => $self->driver ) - ); + + return Bread::Board::Literal->new( name => 'driver', value => $self->driver ); } +=head2 build_file_service + +=cut + sub build_file_service { my $self = shift; - $self->add_service( - Bread::Board::Literal->new( name => 'file', value => $self->file ) - ); + + return Bread::Board::Literal->new( name => 'file', value => $self->file ); } +=head2 build_substitutions_service + +=cut + sub build_substitutions_service { my $self = shift; - $self->add_service( - Bread::Board::Literal->new( name => 'substitutions', value => $self->substitutions ) - ); + + return Bread::Board::Literal->new( name => 'substitutions', value => $self->substitutions ); } +=head2 build_extensions_service + +=cut + sub build_extensions_service { my $self = shift; - $self->add_service( - Bread::Board::BlockInjection->new( - name => 'extensions', - block => sub { - return \@{Config::Any->extensions}; - }, - ) + + return Bread::Board::BlockInjection->new( + name => 'extensions', + block => sub { + return \@{Config::Any->extensions}; + }, ); } +=head2 build_prefix_service + +=cut + 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') ], - ) + + return Bread::Board::BlockInjection->new( + name => 'prefix', + block => sub { + return Catalyst::Utils::appprefix( shift->param('name') ); + }, + dependencies => [ depends_on('name') ], ); } +=head2 build_path_service + +=cut + sub build_path_service { my $self = shift; - $self->add_service( - Bread::Board::BlockInjection->new( - name => 'path', - block => sub { - my $s = shift; - - return Catalyst::Utils::env_value( $s->param('name'), 'CONFIG' ) - || $s->param('file') - || $s->param('name')->path_to( $s->param('prefix') ); - }, - dependencies => [ depends_on('file'), depends_on('name'), depends_on('prefix') ], - ) + + return Bread::Board::BlockInjection->new( + name => 'path', + block => sub { + my $s = shift; + + return Catalyst::Utils::env_value( $s->param('name'), 'CONFIG' ) + || $s->param('file') + || $s->param('name')->path_to( $s->param('prefix') ); + }, + dependencies => [ depends_on('file'), depends_on('name'), depends_on('prefix') ], ); } +=head2 build_config_service + +=cut + sub build_config_service { my $self = shift; - $self->add_service( - Bread::Board::BlockInjection->new( - name => 'config', - block => sub { - my $s = shift; - - my $v = Data::Visitor::Callback->new( - plain_value => sub { - return unless defined $_; - return $self->_config_substitutions( $s->param('name'), $s->param('substitutions'), $_ ); - } - - ); - $v->visit( $s->param('raw_config') ); - }, - dependencies => [ depends_on('name'), depends_on('raw_config'), depends_on('substitutions') ], - ) + + return Bread::Board::BlockInjection->new( + name => 'config', + block => sub { + my $s = shift; + + my $v = Data::Visitor::Callback->new( + plain_value => sub { + return unless defined $_; + return $self->_config_substitutions( $s->param('name'), $s->param('substitutions'), $_ ); + } + + ); + $v->visit( $s->param('raw_config') ); + }, + dependencies => [ depends_on('name'), depends_on('raw_config'), depends_on('substitutions') ], ); } +=head2 build_raw_config_service + +=cut + sub build_raw_config_service { my $self = shift; - $self->add_service( - Bread::Board::BlockInjection->new( - name => 'raw_config', - block => sub { - my $s = shift; - - my @global = @{$s->param('global_config')}; - my @locals = @{$s->param('local_config')}; - - my $config = {}; - for my $cfg (@global, @locals) { - for (keys %$cfg) { - $config = Catalyst::Utils::merge_hashes( $config, $cfg->{$_} ); - } + + return Bread::Board::BlockInjection->new( + name => 'raw_config', + block => sub { + my $s = shift; + + my @global = @{$s->param('global_config')}; + my @locals = @{$s->param('local_config')}; + + my $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') ], - ) + } + return $config; + }, + dependencies => [ depends_on('global_config'), depends_on('local_config') ], ); } +=head2 build_global_files_service + +=cut + sub build_global_files_service { my $self = shift; - $self->add_service( - Bread::Board::BlockInjection->new( - name => 'global_files', - block => sub { - my $s = shift; - my ( $path, $extension ) = @{$s->param('config_path')}; + return Bread::Board::BlockInjection->new( + name => 'global_files', + block => sub { + my $s = shift; - my @extensions = @{$s->param('extensions')}; + my ( $path, $extension ) = @{$s->param('config_path')}; - my @files; - if ( $extension ) { - die "Unable to handle files with the extension '${extension}'" unless grep { $_ eq $extension } @extensions; - push @files, $path; - } else { - @files = map { "$path.$_" } @extensions; - } - return \@files; - }, - dependencies => [ depends_on('extensions'), depends_on('config_path') ], - ) + my @extensions = @{$s->param('extensions')}; + + my @files; + if ( $extension ) { + die "Unable to handle files with the extension '${extension}'" unless grep { $_ eq $extension } @extensions; + push @files, $path; + } else { + @files = map { "$path.$_" } @extensions; + } + return \@files; + }, + dependencies => [ depends_on('extensions'), depends_on('config_path') ], ); } +=head2 build_local_files_service + +=cut + sub build_local_files_service { my $self = shift; - $self->add_service( - Bread::Board::BlockInjection->new( - name => 'local_files', - block => sub { - my $s = shift; - - my ( $path, $extension ) = @{$s->param('config_path')}; - my $suffix = $s->param('config_local_suffix'); - - my @extensions = @{$s->param('extensions')}; - - my @files; - if ( $extension ) { - die "Unable to handle files with the extension '${extension}'" unless grep { $_ eq $extension } @extensions; - $path =~ s{\.$extension}{_$suffix.$extension}; - push @files, $path; - } else { - @files = map { "${path}_${suffix}.$_" } @extensions; - } - return \@files; - }, - dependencies => [ depends_on('extensions'), depends_on('config_path'), depends_on('config_local_suffix') ], - ) + + return Bread::Board::BlockInjection->new( + name => 'local_files', + block => sub { + my $s = shift; + + my ( $path, $extension ) = @{$s->param('config_path')}; + my $suffix = $s->param('config_local_suffix'); + + my @extensions = @{$s->param('extensions')}; + + my @files; + if ( $extension ) { + die "Unable to handle files with the extension '${extension}'" unless grep { $_ eq $extension } @extensions; + $path =~ s{\.$extension}{_$suffix.$extension}; + push @files, $path; + } else { + @files = map { "${path}_${suffix}.$_" } @extensions; + } + return \@files; + }, + dependencies => [ depends_on('extensions'), depends_on('config_path'), depends_on('config_local_suffix') ], ); } +=head2 build_global_config_service + +=cut + 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, - use_ext => 1, - driver_args => $s->param('driver'), - }); - }, - dependencies => [ depends_on('global_files') ], - ) + + return 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, + use_ext => 1, + driver_args => $s->param('driver'), + }); + }, + dependencies => [ depends_on('global_files') ], ); } +=head2 build_local_config_service + +=cut + sub build_local_config_service { my $self = shift; - $self->add_service( - Bread::Board::BlockInjection->new( - name => 'local_config', - block => sub { - my $s = shift; - - return Config::Any->load_files({ - files => $s->param('local_files'), - filter => \&_fix_syntax, - use_ext => 1, - driver_args => $s->param('driver'), - }); - }, - dependencies => [ depends_on('local_files') ], - ) + + return Bread::Board::BlockInjection->new( + name => 'local_config', + block => sub { + my $s = shift; + + return Config::Any->load_files({ + files => $s->param('local_files'), + filter => \&_fix_syntax, + use_ext => 1, + driver_args => $s->param('driver'), + }); + }, + dependencies => [ depends_on('local_files') ], ); } +=head2 build_config_path_service + +=cut + sub build_config_path_service { my $self = shift; - $self->add_service( - Bread::Board::BlockInjection->new( - name => 'config_path', - block => sub { - my $s = shift; - my $path = $s->param('path'); - my $prefix = $s->param('prefix'); + return Bread::Board::BlockInjection->new( + name => 'config_path', + block => sub { + my $s = shift; - my ( $extension ) = ( $path =~ m{\.(.{1,4})$} ); + my $path = $s->param('path'); + my $prefix = $s->param('prefix'); - if ( -d $path ) { - $path =~ s{[\/\\]$}{}; - $path .= "/$prefix"; - } + my ( $extension ) = ( $path =~ m{\.(.{1,4})$} ); + + if ( -d $path ) { + $path =~ s{[\/\\]$}{}; + $path .= "/$prefix"; + } - return [ $path, $extension ]; - }, - dependencies => [ depends_on('prefix'), depends_on('path') ], - ) + return [ $path, $extension ]; + }, + dependencies => [ depends_on('prefix'), depends_on('path') ], ); } +=head2 build_config_local_suffix_service + +=cut + 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; - - return $suffix; - }, - dependencies => [ depends_on('name') ], - ) + + return 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; + + return $suffix; + }, + dependencies => [ depends_on('name') ], ); } +=head2 _fix_syntax + +=cut + sub _fix_syntax { my $config = shift; my @components = ( @@ -370,6 +431,10 @@ sub _fix_syntax { } } +=head2 _config_substitutions + +=cut + sub _config_substitutions { my ( $self, $name, $subs, $arg ) = @_; @@ -393,4 +458,23 @@ sub _config_substitutions { return $arg; } +=head1 AUTHORS + +=over 4 + +=item Justin Hunter (arcanez) + +=item André Walker (andrewalker) + +=back + +Based on L, by Brian Cassidy. + +=head1 LICENSE + +This library is free software. You can redistribute it and/or modify it under +the same terms as Perl itself. + +=cut + 1; diff --git a/lib/Catalyst/Service/WithContext.pm b/lib/Catalyst/Service/WithContext.pm index cd560c7..6225cc5 100644 --- a/lib/Catalyst/Service/WithContext.pm +++ b/lib/Catalyst/Service/WithContext.pm @@ -28,3 +28,34 @@ around 'get' => sub { no Moose::Role; 1; + +__END__ + +=pod + +=head1 NAME + +Catalyst::Service::WithContext + +=head1 DESCRIPTION + +=head1 METHODS + +=over 4 + +=item B + +=item B + +=back + +=head1 AUTHOR + +André Walker + +=head1 LICENSE + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut