use remote's module sender if it exists
[scpubgit/Object-Remote.git] / lib / Object / Remote / Role / Connector / PerlInterpreter.pm
1 package Object::Remote::Role::Connector::PerlInterpreter;
2
3 use IPC::Open2;
4 use Object::Remote::ModuleSender;
5 use Object::Remote::Handle;
6 use Scalar::Util qw(blessed);
7 use Moo::Role;
8
9 with 'Object::Remote::Role::Connector';
10
11 around connect => sub {
12   my ($orig, $self) = (shift, shift);
13   my $conn = $self->$orig(@_);
14   my ($hook) =
15     grep {blessed($_) && $_->isa('Object::Remote::ModuleLoader::Hook') }
16       @INC;
17   my $sender = $hook ? $hook->sender : Object::Remote::ModuleSender->new;
18   Object::Remote::Handle->new(
19     connection => $conn,
20     class => 'Object::Remote::ModuleLoader',
21     args => { module_sender => $sender }
22   )->disarm_free;
23   return $conn;
24 };
25
26 sub _perl_command { 'perl', '-' }
27
28 sub _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]': $!";
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]': $!";
38   return ($foreign_stdin, $foreign_stdout, $pid);
39 }
40
41 1;