Ambrosia
view release on metacpan or search on metacpan
lib/Ambrosia/DataProvider.pm view on Meta::CPAN
package Ambrosia::DataProvider;
use strict;
use warnings;
use Carp qw/croak/;
use Ambrosia::Assert;
require Ambrosia::core::ClassFactory;
use Ambrosia::Meta;
class sealed {
extends => [qw/Exporter/],
private => [qw/_list/],
};
our $VERSION = 0.010;
our @EXPORT = qw/storage/;
our %PROCESS_MAP = ();
our %STORAGE = ();
sub import
{
my $pkg = shift;
my %prm = @_;
assign($prm{assign}) if $prm{assign};
__PACKAGE__->export_to_level(1, @EXPORT);
}
sub assign
{
$PROCESS_MAP{$$} = shift;
}
sub new : Private
{
return shift->SUPER::new(@_);
}
sub instance
{
my $package = shift;
my $key = shift;
unless ( $STORAGE{$key} )
{
my %params = @_ == 1 ? %{$_[0]} : @_;
my %list = ();
foreach my $driverType ( keys %params )
{
foreach my $p ( ref $params{$driverType} eq 'ARRAY' ? @{$params{$driverType}} : $params{$driverType} )
{
my %h = %$p;
my ($source_name, $engine_name) = @h{qw/source_name engine_name/};
delete @h{qw/source_name engine_name/};
$p->{type} = $driverType;
$list{$driverType}->{$source_name}
= Ambrosia::core::ClassFactory::create_object(
'Ambrosia::DataProvider::' . $driverType . '::' . $engine_name, \%h);
}
}
$STORAGE{$key} = $package->new(_list => \%list);
}
return $STORAGE{$key};
}
sub storage
{
my $key = shift || $PROCESS_MAP{$$};
assert {$key} 'First access to Ambrosia::DataProvider without assign to storage.';
return __PACKAGE__->instance($key);
}
sub destroy
{
%STORAGE = ();
}
sub add_source
{
my $self = shift;
my %params = @_ == 1 ? %{$_[0]} : @_;
my %list = ();
foreach my $driverType ( keys %params )
{
foreach my $p ( ref $params{$driverType} eq 'ARRAY' ? @{$params{$driverType}} : $params{$driverType} )
{
my %h = %$p;
my ($source_name, $engine_name) = @h{qw/source_name engine_name/};
delete @h{qw/source_name engine_name/};
$list{$driverType}->{$source_name}
= Ambrosia::core::ClassFactory::create_object(
'Ambrosia::DataProvider::' . $driverType . '::' . $engine_name, \%h);
( run in 1.117 second using v1.01-cache-2.11-cpan-3c2a17b8caa )