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 )