#
# Module Generated by Template::Tiny on [% date %]
#

package ZMQ::FFI::[% zmqver %]::Socket;

use FFI::Platypus;
use FFI::Platypus::Buffer;
use FFI::Platypus::Memory qw(malloc free memcpy);

use Carp qw(croak carp);
use Try::Tiny;

use ZMQ::FFI::[% zmqver %]::Raw;
use ZMQ::FFI::Custom::Raw;
use ZMQ::FFI::Constants qw(:all);
use ZMQ::FFI::Util qw(current_tid);
[% lib_imports %]
use Moo;
use namespace::clean;

no if $] >= 5.018, warnings => "experimental";
use feature 'switch';

with qw(
    ZMQ::FFI::SocketRole
    ZMQ::FFI::ErrorHelper
    ZMQ::FFI::Versioner
);

my $FFI_LOADED;

sub BUILD {
    my ($self) = @_;

    unless ($FFI_LOADED) {
        ZMQ::FFI::Custom::Raw::load($self->soname);
        ZMQ::FFI::[% zmqver %]::Raw::load($self->soname);
        $FFI_LOADED = 1;
    }

    # force init zmq_msg_t
    $self->_zmq_msg_t;

    # ensure clean edge state
    while ( $self->has_pollin ) {
        $self->recv();
    }

    # set default linger
    $self->set_linger(0);
}

[% FOREACH method IN api_methods %]
[%- [%- method -%] -%]
[% END %]

sub DEMOLISH {
    my ($self) = @_;

    # remove ourselves from the context object so that we dont leak
    $self->context->_remove_socket($self) if (defined $self->context);

    return if $self->socket_ptr == -1;

    $self->close();
}

1;

# vim:ft=perl