Paws-Net-MultiplexCaller

 view release on metacpan or  search on metacpan

lib/Paws/Net/MultiplexCaller.pm  view on Meta::CPAN

package Paws::Net::MultiplexCaller;
  use Moose;
  with 'Paws::Net::CallerRole';

  our $VERSION = '0.03';

  # TODO: HashRef of things that do Paws::Net::CallerRole
  has caller_for => (is => 'ro', isa => 'HashRef', required => 1);
  # TODO: thing that does Paws::Net::CallerRole or Undef
  has default_caller => (is => 'ro', isa => 'Object');

  sub get_implementation {
    my ($self, $service) = @_;
    return $self->caller_for->{ $service } if (defined $self->caller_for->{ $service });
    return $self->default_caller if (defined $self->default_caller);
    die "Can't find a caller for $service";
  }

  sub do_call {
    my ($self, $service, $call_object) = @_;
    return $self->get_implementation($self->service_from_callobject($call_object))
             ->do_call($service, $call_object);
  }

  sub caller_to_response {
    #my ($self, $service, $call_object, $status, $content, $headers) = @_;
    die "Die caller_to_response is not needed on the Multiplex caller";
  }

  sub service_from_callobject {
    my ($self, $call_object) = @_;
    my ($svc_name) = ($call_object->meta->name =~ m/^Paws::(\w+)::/);
    die "$call_object doesn't seem to be a Paws::SERVICE::CALL" if (not defined $svc_name);
    return $svc_name;
  }

1;
### main pod documentation begin ###

=encoding UTF-8

=head1 NAME

Paws::Net::MultiplexCaller - Control routing of services to Paws callers

=head1 SYNOPSIS

  use Paws::Net::MultiplexCaller;
  use Paws::Net::LWPCaller;
  use Paws::Net::MockCaller;

  my $paws = Paws->new(
    config => {
      caller => Paws::Net::MultiplexCaller->new(
        caller_for => {
          SQS => Paws::Net::LWPCaller->new(),
          EC2 => Paws::Net::MockCaller->new(...),
        },
        default_caller => Paws::Net::Caller->new
      )
    }
  );

  # SQS methods will be called with LWPCaller
  # $paws->service('SQS', region => 'eu-west-1')->CreateQueue
  # EC2 with the MockCaller
  # $paws->service('EC2', region => 'us-east-1')->RunInstances
  # others will be called with the default Paws::Net::Caller



( run in 1.379 second using v1.01-cache-2.11-cpan-39bf76dae61 )