package ZMQ::LibCZMQ1;
use strict;
use Exporter 'import';
use XSLoader;
our $VERSION;
BEGIN {
    $VERSION = '0.02';
    XSLoader::load(__PACKAGE__, $VERSION);
}

our %EXPORT_TAGS = (
    zctx => [ qw(
        zctx_new
        zctx_destroy
        zctx_set_iothreads
        zctx_set_linger
        zctx_interrupted
    ) ],
    zsocket => [
        qw(
        zsocket_new
        zsocket_destroy
        zsocket_bind
        zsocket_connect
        zsocket_poll
        ),
        # These functions originally were named zsockopt_*
        # but have since been renamed in czmq. we now only
        # support these newer functions
        qw(
        zsocket_type
        zsocket_sndhwm
        zsocket_set_sndhwm
        zsocket_rcvhwm
        zsocket_set_rcvhwm
        zsocket_affinity
        zsocket_set_affinity
        zsocket_set_subscribe
        zsocket_set_unsubscribe
        zsocket_identity
        zsocket_set_identity
        zsocket_rate
        zsocket_set_rate
        zsocket_recovery_ivl
        zsocket_set_recovery_ivl
        zsocket_sndbuf
        zsocket_set_sndbuf
        zsocket_rcvbuf
        zsocket_set_rcvbuf
        zsocket_linger
        zsocket_set_linger
        zsocket_reconnect_ivl
        zsocket_set_reconnect_ivl
        zsocket_reconnect_ivl_max
        zsocket_set_reconnect_ivl_max
        zsocket_backlog
        zsocket_set_backlog
        zsocket_maxmsgsize
        zsocket_set_maxmsgsize
        zsocket_multicast_hops
        zsocket_set_multicast_hops
        zsocket_rcvtimeo
        zsocket_set_rcvtimeo
        zsocket_sndtimeo
        zsocket_set_sndtimeo
        zsocket_ipv4only
        zsocket_set_ipv4only
        zsocket_set_delay_attach_on_connect
        zsocket_set_router_mandatory
        zsocket_set_router_raw
        zsocket_set_xpub_verbose
        zsocket_rcvmore
        zsocket_fd
        zsocket_events
        zsocket_last_endpoint
        )
    ],
    zstr => [ qw(
        zstr_send
        zstr_recv
        zstr_recv_nowait
        zstr_send
        zstr_sendm
    ) ],
    zmsg => [ qw(
        zmsg_add
        zmsg_addmem
        zmsg_addstr
        zmsg_content_size
        zmsg_decode
        zmsg_destroy
        zmsg_dup
        zmsg_dump
        zmsg_encode
        zmsg_first
        zmsg_last
        zmsg_load
        zmsg_new
        zmsg_next
        zmsg_pop
        zmsg_popstr
        zmsg_push
        zmsg_pushmem
        zmsg_pushstr
        zmsg_recv
        zmsg_remove
        zmsg_save
        zmsg_send
        zmsg_size
        zmsg_unwrap
        zmsg_wrap
    ) ],
    zframe => [ qw(
        zframe_data
        zframe_destroy
        zframe_dup
        zframe_eq
        zframe_more
        zframe_new
        zframe_print
        zframe_recv
        zframe_recv_nowait
        zframe_reset
        zframe_send
        zframe_size
        zframe_strdup
        zframe_streq
        zframe_strhex
    ) ],
);
our @EXPORT = map { @$_ } values %EXPORT_TAGS;

sub zstr_send {
    my ($socket, $message, @args) = @_;
    if (@args) {
        $message = sprintf $message, @args;
    }
    _zstr_send( $socket, $message );
}

sub zsocket_bind {
    my ($socket, $address, @args) = @_;
    if (@args) {
        $address = sprintf $address, @args;
    }
    _zsocket_bind( $socket, $address );
}

sub zsocket_connect {
    my ($socket, $address, @args) = @_;
    if (@args) {
        $address = sprintf $address, @args;
    }
    _zsocket_connect( $socket, $address );
}

sub zmsg_pushstr {
    my ($msg, $fmt, @args) = @_;
    my $buf = sprintf $fmt, @args;
    zmsg_pushmem( $msg, $buf, length $buf );
}

sub zmsg_addstr {
    my ($msg, $fmt, @args) = @_;
    my $buf = sprintf $fmt, @args;
    zmsg_addmem( $msg, $buf, length $buf );
}

1;

=head1 NAME

ZMQ::LibCZMQ1 - Wrapper Around czmq high level ZMQ API

=head1 SYNOPSIS

    use ZMQ::LibCZMQ1;

    my $ctx = zctx_new();
    zctx_destroy( $ctx );
    zctx_set_iothreads( $ctx, $iothreads );
    zctx_set_linger( $ctx, $linger );

    # ...and a lot more

=head1 DESCRIPTION

This is a wrapper around libczmq (1.3.4). Versions prior to 1.3.4 have been
deliberately dropped off from the supported libczmq version (however,
patches are welcome)

This module is still in heavey development. Please send issues, patches and pull 
requests if you have problems.

=head1 INSTALLATION

You need to make sure that BOTH libzmq and libczmq files are searchable when
the compilation happens: Consider this case: you have zeromq-2.x in 
/usr/local, but you want to build against a custom zeromq-3.x in /path/to/app.
If you don't specify anything, your compiler will look find zeromq-2.x in the
standard location (/usr/local) and not the custom one.

If you installed your libraries with pkg-config data, then our scripts should
be able to detect them automatically (but of course, you still need to
make sure that zeromq-3.x files are found before zeromq-2.x files in the
above scenario). Otherwise, use ZMQ_HOME and CZMQ_HOME environment
variables:

    ZMQ_HOME=/path/to/zeromq \
    CZMQ_HOME=/path/to/czmq \
        perl Makefile.PL
    make
    make test
    make install

=head1 FUNCTIONS

=head2 zmq_version()

Returns the version of libzmq this czmq (and hence this module) is built against.

In list context, returns 3 elements consisting of major version, minor version, and patch version.

In scalar context returns dotted version string.

=head2 czmq_version()

Returns the version of czmq this module is built against.

In list context, returns 3 elements consisting of major version, minor version, and patch version.

In scalar context returns dotted version string.

=head2 zctx_destroy

=head2 zctx_interrupted

=head2 zctx_new

=head2 zctx_set_iothreads

=head2 zctx_set_linger

=head2 zframe_data

=head2 zframe_destroy

=head2 zframe_dup

=head2 zframe_eq

=head2 zframe_more

=head2 zframe_new

=head2 zframe_print

=head2 zframe_recv

=head2 zframe_recv_nowait

=head2 zframe_reset

=head2 zframe_send

=head2 zframe_size

=head2 zframe_strdup

=head2 zframe_streq

=head2 zframe_strhex

=head2 zframe_zero_copy

=head2 zmsg_add

=head2 zmsg_addmem

=head2 zmsg_addstr

=head2 zmsg_content_size

=head2 zmsg_decode

=head2 zmsg_destroy

=head2 zmsg_dump

=head2 zmsg_dup

=head2 zmsg_encode

=head2 zmsg_first

=head2 zmsg_last

=head2 zmsg_load

=head2 zmsg_new

=head2 zmsg_next

=head2 zmsg_pop

=head2 zmsg_popstr

=head2 zmsg_push

=head2 zmsg_pushmem

=head2 zmsg_pushstr

=head2 zmsg_recv

=head2 zmsg_remove

=head2 zmsg_save

=head2 zmsg_send

=head2 zmsg_size

=head2 zmsg_unwrap

=head2 zmsg_wrap

=head2 zsocket_bind

=head2 zsocket_connect

=head2 zsocket_destroy

=head2 zsocket_new

=head2 zsocket_poll

=head2 zsocket_type_str

=head2 zsocket_affinity

=head2 zsocket_backlog

=head2 zsocket_events

=head2 zsocket_fd

=head2 zsocket_hwm

=head2 zsocket_linger

=head2 zsocket_maxmsgsize

=head2 zsocket_mcast_loop (only in libzmq 2.x)

=head2 zsocket_rate

=head2 zsocket_rcvbuf

=head2 zsocket_rcvhwm (only for libzmq 3.x)

=head2 zsocket_rcvmore

=head2 zsocket_reconnect_ivl

=head2 zsocket_reconnect_ivl_max

=head2 zsocket_recovery_ivl

=head2 zsocket_recovery_ivl_msec (only for libzmq 2.x)

=head2 zsocket_set_affinity

=head2 zsocket_set_backlog

=head2 zsocket_set_hwm (only for libzmq 2.x)

=head2 zsocket_set_identity

=head2 zsocket_set_linger

=head2 zsocket_set_maxmsgsize (only for libzmq 3.x)

=head2 zsocket_set_mcast_loop (only in libzmq 2.x)

=head2 zsocket_set_rate

=head2 zsocket_set_rcvbuf

=head2 zsocket_set_rcvhwm (only for libzmq 3.x)

=head2 zsocket_set_reconnect_ivl

=head2 zsocket_set_reconnect_ivl_max

=head2 zsocket_set_recovery_ivl (only in libzmq 2.x)

=head2 zsocket_set_recovery_ivl_msec (only in libzmq 2.x)

=head2 zsocket_set_sndbuf

=head2 zsocket_set_sndhwm

=head2 zsocket_set_subscribe

=head2 zsocket_set_swap (only in libzmq 2.x)

=head2 zsocket_set_unsubscribe

=head2 zsocket_sndbuf

=head2 zsocket_sndhwm

=head2 zsocket_swap (only in libzmq 2.x)

=head2 zsocket_type

=head2 zstr_recv

=head2 zstr_recv_nowait

=head2 zstr_send

=head2 zstr_sendm

=cut
