sub get_keyword_names {
my ($self) = @_;
my $class = $self->lib;
my @methods = Class::Inspector->methods( $class, 'public' );
return \@methods;
}
sub run_keyword {
my $self = shift;
my ($stdout, $stderr) = capture { ... };
}
sub start_server {
my $self = shift;
$self->backend->start_server;
}
####
package RobotRemoteServer::Frontier;
sub _shut_down_request {
RobotRemoteServer::Frontier
sub start_server {
my ($self) = @_;
my $svr = Frontier::Daemon->new(
methods => {
get_keyword_names => sub { $self->get_keyword_names(@_) },
run_keyword => sub { $self->run_keyword($_[0], eval{@{$_[1]}}) },
stop_remote_server => sub {
$srv->_shutdown('yes please');
$self->schedule_shutdown;
return;
},
....
}
sub schedule_shutdown {
my $self = shift;
my $url = $self->url;
if( eval { require threads; } ){
threads::async {
sleep 5;
require Frontier::Client;
Frontier::Client->new( 'url' => $url )->call('stop_remote_server');
};
} elsif( eval { require Proc::Background; } ){
Proc::Background->new(
$^X,
'-e', q{
use Frontier::Client;
sleep 5;
my $url = shift @ARGV;
Frontier::Client->new( 'url' => $url )->call('stop_remote_server');
exit; },
$url,
);
}
}
sub Frontier::Daemon::_shutdown {
my( $self, $true ) = @_;
${*$self}{'_Frontier::Daemon::_shutdown'} = !!$true if $true;
return ${*$self}{'_Frontier::Daemon::_shutdown'} ;
}
sub Frontier::Daemon::accept { ## monkeypatch
package Frontier::Daemon;
my $self = shift;
if( $self->_shutdown ){
close $self;
return;
} else {
return $self->SUPER::accept;
}
}
##
##
use RobotRemoteServer;
#my $rob = RobotRemoteServer->new (qw' host localhost port 666 ');
my $rob = RobotRemoteServer->new (qw'
host localhost
port 666
backend Frontier
lib ExampleLibrary
');
$rob->start_server;