Added to MANIFEST: Changes
Added to MANIFEST: ignore.txt
Added to MANIFEST: lib/RobotRemoteServer.pm
Added to MANIFEST: lib/RobotRemoteServer/Frontier.pm
Added to MANIFEST: lib/RobotRemoteServer/RPCXMLServer.pm
Added to MANIFEST: Makefile.PL
Added to MANIFEST: MANIFEST
Added to MANIFEST: README
Added to MANIFEST: t/00-load.t
Added to MANIFEST: t/boilerplate.t
Added to MANIFEST: t/manifest.t
Added to MANIFEST: t/pod-coverage.t
Added to MANIFEST: t/pod.t
Created starter directories and files
Then maybe write something like
package RobotRemoteServer;
use Class::Inspector;
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_s
+erver');
};
} 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;
}
}
To handle shutdown in similar way as https://robotframework.googlecode.com/hg/tools/remoteserver/robotremoteserver.py you could monkeypatch shutdown, but writing your own frontier deaemon ( Frontier::Daemon::Forking ) is probably the correct way to do it
backend is the new argument, RobotRemoteServer::Frontier by default 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;
Maybe it makes more sense for backends to be named as RobotRemoteServer::Backend::Frontier ...
But that is a start, pod beats comments, seperate backends into seperate modules, use existing modules for introspection , has-a not isa-a ...
Future direction:
maybe Moo/Moose or Badger for accessors/mutators...
Maybe POE server ( ex Hopkins::Plugin::RPC ), ex?Catalyst::Plugin::Server::XMLRPC, Plack for ideas
maybe cooperation with Daemon::Generic, AnyEvent::XMLRPC, ...
If I were more knowledgeable, I might make better suggestions ;) |