# NAME

POEx::ZMQ - Asynchronous ZeroMQ sockets for POE

# SYNOPSIS

    # An example ZMQ_ROUTER socket ->
    use POE;
    use POEx::ZMQ;

    POE::Session->create(
      inline_states => +{
        _start => sub {
          # Set up a ROUTER; save our Context for creating other sockets later:
          $_[HEAP]->{ctx} = POEx::ZMQ->context;

          $_[HEAP]->{rtr} = POEx::ZMQ->socket(
            context => $_[HEAP]->{ctx},
            type    => ZMQ_ROUTER,
          );

          $_[HEAP]->{rtr}->start;

          $_[HEAP]->{rtr}->bind( 'tcp://127.0.0.1:1234' );
        },

        zmq_recv_multipart => sub {
          # ROUTER got message from REQ; sender identity is prefixed,
          # parts are available as a List::Objects::WithUtils::Array ->
          my $parts = $_[ARG0];
          my ($id, undef, $content) = $parts->all;

          my $response;
          # ...

          # $_[SENDER] was the ROUTER socket, send a response back:
          $_[KERNEL]->post( $_[SENDER], send_multipart =>
            $id, '', $response
          );
        },
      },
    );

    POE::Kernel->run;

# DESCRIPTION

A [POE](https://metacpan.org/pod/POE) component providing non-blocking [ZeroMQ](http://www.zeromq.org)
(versions 3.x & 4.x) integration.

See [POEx::ZMQ::Socket](https://metacpan.org/pod/POEx::ZMQ::Socket) for details on using sockets.

Each ZeroMQ socket is an event emitter powered by [MooX::Role::POE::Emitter](https://metacpan.org/pod/MooX::Role::POE::Emitter);
the documentation for that distribution is likely to be helpful.

**This is early-development software,** as indicated by the `0.x` version number.
The test suite is incomplete, bugs are sure to be lurking, documentation is
not yet especially verbose, and the API is not completely guaranteed.  Issues
& pull requests are welcome, of course:
[http://www.github.com/avenj/poex-zmq](http://www.github.com/avenj/poex-zmq)

If you are not using [POE](https://metacpan.org/pod/POE), try [ZMQ::FFI](https://metacpan.org/pod/ZMQ::FFI) for an excellent loop-agnostic
ZeroMQ implementation.

## import 

Importing this package brings in the full set of [POEx::ZMQ::Constants](https://metacpan.org/pod/POEx::ZMQ::Constants), and
ensures [POEx::ZMQ::Socket](https://metacpan.org/pod/POEx::ZMQ::Socket) is loaded.

### context

    my $ctx = POEx::ZMQ->context(max_sockets => 512);

Returns a new [POEx::ZMQ::FFI::Context](https://metacpan.org/pod/POEx::ZMQ::FFI::Context). `@_` is passed through.

The context object should be shared between sockets belonging to the same
process; a forked child process should create a new context with its own set
of sockets.

### socket

    my $sock = POEx::ZMQ->socket(context => $ctx, type => ZMQ_ROUTER);

Returns a new [POEx::ZMQ::Socket](https://metacpan.org/pod/POEx::ZMQ::Socket). `@_` is passed through.

# AUTHOR

Jon Portnoy <avenj@cobaltirc.org>

Significant portions of the [POEx::ZMQ::FFI](https://metacpan.org/pod/POEx::ZMQ::FFI) backend are inspired by or
derived from [ZMQ::FFI](https://metacpan.org/pod/ZMQ::FFI) (version 0.14) by Dylan Cali (CPAN: CALID).

Licensed under the same terms as Perl.
