Commit | Line | Data |
a9fdb55e |
1 | package Object::Remote::Role::Connector::PerlInterpreter; |
2 | |
3 | use IPC::Open2; |
4 | use Object::Remote::ModuleSender; |
5 | use Object::Remote::Handle; |
18e789ab |
6 | use Scalar::Util qw(blessed); |
a9fdb55e |
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(@_); |
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 | |
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]': $!"; |
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 | |
41 | 1; |