use strictures 1;
use feature 'say';
my $addr = $ARGV[0] || 'tcp://127.0.0.1:5510';

## REQ client that talks to ping_server.pl

use POE;
use POEx::ZMQ3::Requestor;

POE::Session->create(
  heap => POEx::ZMQ3::Requestor->new,
  package_states => [
    main => [ qw/
      _start
      send_ping
      zeromq_registered
      zeromq_got_reply
    / ],
  ],
);

sub _start {
  my ($kern, $zrequest) = @_[KERNEL, HEAP];
  $zrequest->start( $addr );
  $kern->post( $zrequest => 'subscribe' );
}

sub zeromq_registered {
  my ($kern, $zrequest) = @_[KERNEL, HEAP];
  $kern->yield( 'send_ping' );
}

sub zeromq_got_reply {
  my ($kern, $zrequest) = @_[KERNEL, HEAP];
  my $data = $_[ARG0];
  say "Got PONG";
  $kern->delay_add( 'send_ping' => 1 );
}

sub send_ping {
  my ($kern, $zrequest) = @_[KERNEL, HEAP];
  say "Sending PING";
  $zrequest->request( 'ping!' );
}

$poe_kernel->run;