package WebCoso::Config; use strict; use warnings; use WebCoso::Collections; use WebCoso::Pipeline; use WebCoso::X; use utf8; my @resources; my $collections=WebCoso::Collections->new(); my %resource_to_pipeline; sub read_scalar { my ($class,$content,$filename)=@_; $WebCoso::Config::Helpers::FILENAME=$filename; $content=<<'EOF'.$content; package WEBCOSO::CONFIG; no strict; WebCoso::Config::Helpers->import(); EOF eval $content; if ($@) { WebCoso::X::ConfigError->throw( filename => $filename, nested => $@, ); } else { return 1; } } sub add_resource { my ($class,$resource)=@_; push @resources,$resource; } sub get_all_resources { return @resources; } sub add_collection { my ($class,$collection)=@_; $collections->add_collection($collection); } sub get_collections { return $collections; } sub get_pipeline_for { my ($class, $resource)=@_; WebCoso::X::NoSuchResource->throw( resource => $resource, ) unless exists $resource_to_pipeline{$resource}; return $resource_to_pipeline{$resource}; } sub clear { @resources=(); $collections=WebCoso::Collections->new(); %resource_to_pipeline=(); } package WebCoso::Config::Helpers; use Path::Class; use WebCoso::Resource; use WebCoso::Collection; use Exporter::Lite; use vars qw($FILENAME @EXPORT); @EXPORT=qw(res coll); sub res { my $dest_filename=pop @_; my $short_pipeline_name=pop @_; my @source_files=@_; my $config_dir=file($FILENAME)->parent->absolute; $dest_filename=file($dest_filename)->absolute($config_dir); my @abs_source_files = map { my $abs_name=file($_)->absolute($config_dir); if (!-e $abs_name) { WebCoso::X::FileNotFound->throw( filename => $_, abs_filename => $abs_name, ); }; $abs_name; } @source_files; my $pipeline_name="WebCoso::Pipeline::$short_pipeline_name"; if (! WebCoso::Pipeline->is_pipeline($pipeline_name)) { WebCoso::X::NoSuchPipeline->throw( pipeline => $short_pipeline_name, ); }; my $resource=WebCoso::Resource->new(); $resource->set_property(sources=>[@abs_source_files]); $resource->set_property(destination=>$dest_filename); for my $filename (@abs_source_files) { $resource->set_property( {filename=>$filename}, datastream => sub{_open_file($filename)}, ); } WebCoso::Config->add_resource($resource); # brutto! $resource_to_pipeline{$resource}=$pipeline_name; return $resource; } sub coll { my ($name,$parents,$children,$resources)=@_; my $collection=WebCoso::Collection->new({ name=>$name, parents=>$parents||[], children=>$children||[], resources=>$resources||[], }); return $collection; } sub _open_file { my ($filename)=@_; open my $fh,'<:raw',$filename or WebCoso::X::OpenError->throw( filename => $filename, error => $!); return $fh; } 1;