[Catalyst-commits] r13418 -
Catalyst-Runtime/5.80/branches/gsoc_breadboard/lib/Catalyst
arcanez at dev.catalyst.perl.org
arcanez at dev.catalyst.perl.org
Sat Jul 24 03:39:11 GMT 2010
Author: arcanez
Date: 2010-07-24 04:39:11 +0100 (Sat, 24 Jul 2010)
New Revision: 13418
Added:
Catalyst-Runtime/5.80/branches/gsoc_breadboard/lib/Catalyst/Container.pm
Log:
Bread::Board::Container
Added: Catalyst-Runtime/5.80/branches/gsoc_breadboard/lib/Catalyst/Container.pm
===================================================================
--- Catalyst-Runtime/5.80/branches/gsoc_breadboard/lib/Catalyst/Container.pm (rev 0)
+++ Catalyst-Runtime/5.80/branches/gsoc_breadboard/lib/Catalyst/Container.pm 2010-07-24 03:39:11 UTC (rev 13418)
@@ -0,0 +1,262 @@
+package Catalyst::Container;
+use Bread::Board;
+use Moose;
+use Config::Any;
+use Data::Visitor::Callback;
+use Catalyst::Utils ();
+
+extends 'Bread::Board::Container';
+
+has config_local_suffix => (
+ is => 'rw',
+ isa => 'Str',
+ default => 'local',
+);
+
+has driver => (
+ is => 'rw',
+ isa => 'HashRef',
+ default => sub { +{} },
+);
+
+has file => (
+ is => 'rw',
+ isa => 'Str',
+ default => '',
+);
+
+has substitutions => (
+ is => 'rw',
+ isa => 'HashRef',
+ default => sub { +{} },
+);
+
+has name => (
+ is => 'rw',
+ isa => 'Str',
+ default => 'TestApp',
+);
+
+sub BUILD {
+ my $self = shift;
+
+ container $self => as {
+ service name => $self->name;
+ service driver => $self->driver;
+ service file => $self->file;
+ service substitutions => $self->substitutions;
+
+ service extensions => (
+ block => sub {
+ return \@{Config::Any->extensions};
+ },
+ );
+
+ service prefix => (
+ block => sub {
+ return Catalyst::Utils::appprefix( shift->param('name') );
+ },
+ dependencies => [ depends_on('name') ],
+ );
+
+ service 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') ],
+ );
+
+ service 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') ],
+ );
+
+ service 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') ],
+ );
+
+ service global_files => (
+ block => sub {
+ my $s = shift;
+
+ my ( $path, $extension ) = @{$s->param('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') ],
+ );
+
+ service 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') ],
+ );
+
+ service global_config => (
+ block => sub {
+ my $s = shift;
+
+ my @files = @{$s->param('global_files')};
+
+ my $cfg = Config::Any->load_files({
+ files => \@files,
+ filter => \&_fix_syntax,
+ use_ext => 1,
+ driver_args => $s->param('driver'),
+ });
+
+ return $cfg;
+ },
+ dependencies => [ depends_on('global_files') ],
+ );
+
+ service local_config => (
+ block => sub {
+ my $s = shift;
+
+ my @files = @{$s->param('local_files')};
+
+ my $cfg = Config::Any->load_files({
+ files => \@files,
+ filter => \&_fix_syntax,
+ use_ext => 1,
+ driver_args => $s->param('driver'),
+ });
+
+ return $cfg;
+ },
+ dependencies => [ depends_on('local_files') ],
+ );
+
+ service config_path => (
+ block => sub {
+ my $s = shift;
+
+ my $path = $s->param('path');
+ my $prefix = $s->param('prefix');
+
+ my ( $extension ) = ( $path =~ m{\.(.{1,4})$} );
+
+ if ( -d $path ) {
+ $path =~ s{[\/\\]$}{};
+ $path .= "/$prefix";
+ }
+
+ return [ $path, $extension ];
+ },
+ dependencies => [ depends_on('prefix'), depends_on('path') ],
+ );
+
+ service 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') ],
+ );
+
+ };
+}
+
+sub _fix_syntax {
+ my $config = shift;
+ my @components = (
+ map +{
+ prefix => $_ eq 'Component' ? '' : $_ . '::',
+ values => delete $config->{ lc $_ } || delete $config->{ $_ }
+ },
+ grep { ref $config->{ lc $_ } || ref $config->{ $_ } }
+ qw( Component Model M View V Controller C Plugin )
+ );
+
+ foreach my $comp ( @components ) {
+ my $prefix = $comp->{ prefix };
+ foreach my $element ( keys %{ $comp->{ values } } ) {
+ $config->{ "$prefix$element" } = $comp->{ values }->{ $element };
+ }
+ }
+}
+
+sub _config_substitutions {
+ my ($self, $name, $subs) = (shift, shift, shift);
+
+ $subs->{ HOME } ||= sub { shift->path_to( '' ); };
+ $subs->{ ENV } ||=
+ sub {
+ my ( $c, $v ) = @_;
+ if (! defined($ENV{$v})) {
+ Catalyst::Exception->throw( message =>
+ "Missing environment variable: $v" );
+ return "";
+ } else {
+ return $ENV{ $v };
+ }
+ };
+ $subs->{ path_to } ||= sub { shift->path_to( @_ ); };
+ $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;
+ }
+}
+
+1;
More information about the Catalyst-commits
mailing list