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);
29 use Socket
qw(AF_UNIX);
31 =head3 new(argument => value...)
39 Hashref of arguments for L<IO::Socket> configuration. Use C<Domain> to
40 select a socket class.
44 Debug level (refer to L<Net::REPL::Base>).
52 my $class = ref($proto) || $proto;
59 $self->debug('Server starting:', Dumper
($self->{'socket_args'}));
61 my $server = $self->_create_socket(
63 'Proto' => 'SOCK_STREAM',
66 %{$self->{'socket_args'}},
69 die("Couldn't start server: $!\n");
71 $self->{'server'} = $server;
74 $self->{'fh'} = undef;
82 if ($self->{'server'}) {
83 $self->{'server'}->close();
84 $self->{'server'} = undef;
93 $self->{'fh'}->close();
94 $self->{'fh'} = undef;
95 $self->cb_disconnect();
101 Run one iteration of the REPL. Returns true if the socket remains open
102 for further iterations.
104 Blocks until a line of input can be read from the client socket and
105 the result flushed out to it.
112 if (not $self->{'fh'}) {
113 $self->{'fh'} = $self->{'server'}->accept();
119 $self->{'fh'} = undef;
124 my $input = $self->lv_receive();
129 my @output = $self->formatted_eval($input);
130 my $output_s = "@output";
131 $self->lv_send($output_s);
135 =head2 Callback Methods
141 Called when the Server begins to listen for client connections.
143 =item C<cb_connect()>
145 Called whenever a client connection is accepted.
147 =item C<cb_disconnect()>
149 Called whenever a client disconnects.
157 $self->debug("Server PID $$ listening.");
163 if (not $self->{'fh'}) {
166 my $client_details = '';
167 if ($self->{'fh'}->can('peerhost')) {
168 $client_details = ' '
169 . $self->{'fh'}->peerhost()
171 . $self->{'fh'}->peerport();
174 $self->debug("Server PID $$ connected" . $client_details);