successfully wrapping sudo
[scpubgit/Object-Remote.git] / lib / Object / Remote / Role / Connector / PerlInterpreter.pm
CommitLineData
a9fdb55e 1package Object::Remote::Role::Connector::PerlInterpreter;
2
3use IPC::Open2;
4use Object::Remote::ModuleSender;
5use Object::Remote::Handle;
18e789ab 6use Scalar::Util qw(blessed);
a9fdb55e 7use Moo::Role;
8
9with 'Object::Remote::Role::Connector';
10
03f41c0e 11has module_sender => (is => 'lazy');
12
13sub _build_module_sender {
18e789ab 14 my ($hook) =
15 grep {blessed($_) && $_->isa('Object::Remote::ModuleLoader::Hook') }
16 @INC;
03f41c0e 17 return $hook ? $hook->sender : Object::Remote::ModuleSender->new;
18}
19
20around connect => sub {
21 my ($orig, $self) = (shift, shift);
22 my $conn = $self->$orig(@_);
a9fdb55e 23 Object::Remote::Handle->new(
24 connection => $conn,
25 class => 'Object::Remote::ModuleLoader',
03f41c0e 26 args => { module_sender => $self->module_sender }
a9fdb55e 27 )->disarm_free;
28 return $conn;
29};
30
31sub _perl_command { 'perl', '-' }
32
7efea51f 33sub _start_perl {
a9fdb55e 34 my $self = shift;
35 my $pid = open2(
36 my $foreign_stdout,
37 my $foreign_stdin,
38 $self->_perl_command(@_),
39 ) or die "Failed to run perl at '$_[0]': $!";
7efea51f 40 return ($foreign_stdin, $foreign_stdout, $pid);
41}
42
43sub _open2_for {
44 my $self = shift;
45 my ($foreign_stdin, $foreign_stdout, $pid) = $self->_start_perl(@_);
18e789ab 46 require Object::Remote::FatNode;
47 print $foreign_stdin $Object::Remote::FatNode::DATA, "__END__\n"
48 or die "Failed to send fatpacked data to new node on '$_[0]': $!";
a9fdb55e 49 return ($foreign_stdin, $foreign_stdout, $pid);
50}
51
521;