Ambrosia
view release on metacpan or search on metacpan
lib/Ambrosia/RPC.pm view on Meta::CPAN
package Ambrosia::RPC;
use strict;
use Ambrosia::error::Exceptions;
use Ambrosia::RPC::Service;
require Ambrosia::core::Object;
use Ambrosia::Meta;
class {
extends => [qw/Exporter/],
protected => [qw/_list/],
};
our @EXPORT = qw/rpc/;
our $VERSION = 0.010;
our %PROCESS_MAP = ();
our %RPC = ();
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 ( $RPC{$key} )
{
my %params = @_ == 1 ? %{$_[0]} : @_;
my %list = ();
foreach my $serviceType ( keys %params )
{
foreach my $p ( ref $params{$serviceType} eq 'ARRAY' ? @{$params{$serviceType}} : $params{$serviceType} )
{
my $name = $p->{name};
delete $p->{name};
$list{$serviceType}->{$name}
= Ambrosia::RPC::Service->new(service_type => $serviceType, %$p);
}
}
$RPC{$key} = $package->new(_list => \%list);
}
return $RPC{$key};
}
sub rpc
{
return __PACKAGE__->instance(shift || $PROCESS_MAP{$$} || throw Ambrosia::error::Exception::BadUsage("First access to Ambrosia::RPC without assign to RPC."));
}
sub destroy
{
%RPC = ();
}
}
sub service #(serviceType, name)
{
my $self = shift;
my $serviceType = shift;
my $name = shift;
#!!TODO!! ×ÙÚÙ×ÁÔØ ÉÓËÌÀÞÅÎÉÅ ×ÍÅÓÔÏ undef
if ( $serviceType && $name )
{
return $self->_list->{$serviceType}->{$name} || undef;
}
return undef;
}
1;
__END__
=head1 NAME
Ambrosia::RPC - a container for engines, that implement service calls.
( run in 1.666 second using v1.01-cache-2.11-cpan-364913b4093 )