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);
30 =head3 new(argument => value...)
38 E.g. L<IO::Socket::UNIX> (the default) or L<IO::Socket::INET>.
42 Hashref of arguments for the socket class.
46 Debug level (refer to L<Net::REPL::Base>).
54 my $class = ref($proto) || $proto;
56 'socket_class' => 'IO::Socket::UNIX',
62 $self->debug('Server starting:', Dumper
($self->{'socket_args'}));
64 my $server = $self->_create_socket(
65 'Proto' => 'SOCK_STREAM',
68 %{$self->{'socket_args'}},
71 die("Couldn't start server: $!\n");
73 $self->{'server'} = $server;
76 $self->{'fh'} = undef;
84 if ($self->{'server'}) {
85 $self->{'server'}->close();
86 $self->{'server'} = undef;
95 $self->{'fh'}->close();
96 $self->{'fh'} = undef;
97 $self->cb_disconnect();
103 Run one iteration of the REPL. Returns true if the socket remains open
104 for further iterations.
106 Blocks until a line of input can be read from the client socket and
107 the result flushed out to it.
114 if (not $self->{'fh'}) {
115 $self->{'fh'} = $self->{'server'}->accept();
121 $self->{'fh'} = undef;
126 my $input = $self->lv_receive();
131 my @output = $self->formatted_eval($input);
132 my $output_s = "@output";
133 $self->lv_send($output_s);
137 =head2 Callback Methods
143 Called when the Server begins to listen for client connections.
145 =item C<cb_connect()>
147 Called whenever a client connection is accepted.
149 =item C<cb_disconnect()>
151 Called whenever a client disconnects.
159 $self->debug("Server PID $$ listening.");
165 if (not $self->{'fh'}) {
168 my $client_details = '';
169 if ($self->{'fh'}->can('peerhost')) {
170 $client_details = ' '
171 . $self->{'fh'}->peerhost()
173 . $self->{'fh'}->peerport();
176 $self->debug("Server PID $$ connected" . $client_details);