1 package Net
::REPL
::Server
;
9 Net::REPL::Server - Eval + Socket = interactive development
13 Perl processes running Server objects accept and run code
14 interactively from remote clients. Perl code is received over a
15 socket, eval'd, and the Dumper'd result(s) are sent back.
17 This class can be used as-is or superclassed to plug into an event
18 loop or provide additional capabilities like Devel::REPL integration
19 or serializing results so that usuable Perl data structures can be
20 exchanged bidirectionally.
26 use base
qw(Net::REPL::Base);
31 =head3 new(argument => value...)
39 Hashref of arguments for L<IO::Socket::INET>.
43 Debug level (refer to L<Net::REPL::Base>).
51 my $class = ref($proto) || $proto;
58 $self->debug('Server starting:', Dumper
($self->{'socket_args'}));
60 my $server = IO
::Socket
::INET
->new(
64 %{$self->{'socket_args'}},
67 die("Couldn't start server: $!\n");
69 $self->{'server'} = $server;
72 $self->{'fh'} = undef;
80 if ($self->{'server'}) {
81 $self->{'server'}->close();
82 $self->{'server'} = undef;
91 $self->{'fh'}->close();
92 $self->{'fh'} = undef;
93 $self->cb_disconnect();
99 Run one iteration of the REPL. Returns true if the socket remains open
100 for further iterations.
102 Blocks until a line of input can be read from the client socket and
103 the result flushed out to it.
110 if (not $self->{'fh'}) {
111 $self->{'fh'} = $self->{'server'}->accept();
117 $self->{'fh'} = undef;
122 my $input = $self->lv_receive();
127 my @output = $self->formatted_eval($input);
128 my $output_s = "@output";
129 $self->lv_send($output_s);
133 =head2 Callback Methods
139 Called when the Server begins to listen for client connections.
141 =item C<cb_connect()>
143 Called whenever a client connection is accepted.
145 =item C<cb_disconnect()>
147 Called whenever a client disconnects.
155 $self->debug("Server PID $$ listening.");
161 if (not $self->{'fh'}) {
164 $self->debug("Server PID $$ connected with "
165 . $self->{'fh'}->peerhost()
167 . $self->{'fh'}->peerport());