AnyEvent-ZeroMQ

 view release on metacpan or  search on metacpan

lib/AnyEvent/ZeroMQ/Role/WithHandle.pm  view on Meta::CPAN

package AnyEvent::ZeroMQ::Role::WithHandle;
BEGIN {
  $AnyEvent::ZeroMQ::Role::WithHandle::VERSION = '0.01';
}
# ABSTRACT: Role for specialized socket types that has_a handle object
use MooseX::Role::Parameterized;
use MooseX::Types::Moose qw(ArrayRef);
use true;

use AnyEvent::ZeroMQ::Types qw(SocketType SocketDirection Endpoints);
use AnyEvent::ZeroMQ::Handle;
use AnyEvent::ZeroMQ::Handle::Role::Generic;
use AnyEvent::ZeroMQ::Handle::Role::Readable;
use AnyEvent::ZeroMQ::Handle::Role::Writable;
use ZeroMQ::Raw;
use Try::Tiny;
use Carp qw(confess);
use namespace::autoclean;


parameter 'socket_type' => (
    is       => 'ro',
    isa      => SocketType,
    required => 1,
);

parameter 'socket_direction' => (
    is       => 'ro',
    isa      => SocketDirection,
    required => 1,
);

role {
    my $p = shift;

    my $type   = $p->socket_type;
    my $dir    = $p->socket_direction;

    has 'context' => (
        is       => 'ro',
        isa      => 'ZeroMQ::Raw::Context',
        required => 1,
    );

    has 'connect' => (
        init_arg => 'connect',
        isa      => Endpoints,
        default  => sub { [] },
        coerce   => 1,
        traits   => ['Array'],
        handles  => {
            connected_to => 'elements',
            _connect     => 'push',
        },
    );

    has 'bind' => (
        init_arg => 'bind',
        isa      => Endpoints,
        default  => sub { [] },
        coerce   => 1,
        traits   => ['Array'],
        handles  => {
            bound_to => 'elements',
            _bind    => 'push',
        },
    );

    my @roles = 'AnyEvent::ZeroMQ::Handle::Role::Generic';
    push @roles, 'AnyEvent::ZeroMQ::Handle::Role::Readable' if $dir =~ /r/;
    push @roles, 'AnyEvent::ZeroMQ::Handle::Role::Writable' if $dir =~ /w/;
    # XXX: we want to apply @roles, but not until after the
    # parameterized role has been applied.  this poses a problem, so
    # each consumer must do it manually.  wtf.

    # a very simple role metaclass -> method list converter.  only



( run in 1.184 second using v1.01-cache-2.11-cpan-5837b0d9d2c )