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 | |
03f41c0e |
11 | has module_sender => (is => 'lazy'); |
12 | |
13 | sub _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 | |
20 | around 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 | |
31 | sub _perl_command { 'perl', '-' } |
32 | |
33 | sub _open2_for { |
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]': $!"; |
18e789ab |
40 | require Object::Remote::FatNode; |
41 | print $foreign_stdin $Object::Remote::FatNode::DATA, "__END__\n" |
42 | or die "Failed to send fatpacked data to new node on '$_[0]': $!"; |
a9fdb55e |
43 | return ($foreign_stdin, $foreign_stdout, $pid); |
44 | } |
45 | |
46 | 1; |