use remote's module sender if it exists
[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
11around connect => sub {
12 my ($orig, $self) = (shift, shift);
13 my $conn = $self->$orig(@_);
18e789ab 14 my ($hook) =
15 grep {blessed($_) && $_->isa('Object::Remote::ModuleLoader::Hook') }
16 @INC;
17 my $sender = $hook ? $hook->sender : Object::Remote::ModuleSender->new;
a9fdb55e 18 Object::Remote::Handle->new(
19 connection => $conn,
20 class => 'Object::Remote::ModuleLoader',
18e789ab 21 args => { module_sender => $sender }
a9fdb55e 22 )->disarm_free;
23 return $conn;
24};
25
26sub _perl_command { 'perl', '-' }
27
28sub _open2_for {
29 my $self = shift;
30 my $pid = open2(
31 my $foreign_stdout,
32 my $foreign_stdin,
33 $self->_perl_command(@_),
34 ) or die "Failed to run perl at '$_[0]': $!";
18e789ab 35 require Object::Remote::FatNode;
36 print $foreign_stdin $Object::Remote::FatNode::DATA, "__END__\n"
37 or die "Failed to send fatpacked data to new node on '$_[0]': $!";
a9fdb55e 38 return ($foreign_stdin, $foreign_stdout, $pid);
39}
40
411;