save sending fatnode repeatedly
[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(@_);
a8ac86b5 46 print $foreign_stdin 'BEGIN { $ENV{OBJECT_REMOTE_DEBUG} = 1 }'."\n"
47 if $ENV{OBJECT_REMOTE_DEBUG};
b1cbd5be 48 print $foreign_stdin $self->fatnode_text
18e789ab 49 or die "Failed to send fatpacked data to new node on '$_[0]': $!";
a9fdb55e 50 return ($foreign_stdin, $foreign_stdout, $pid);
51}
52
b1cbd5be 53sub fatnode_text {
54 my ($self) = @_;
55 require Object::Remote::FatNode;
56 my $text = '';
57 $text .= 'BEGIN { $ENV{OBJECT_REMOTE_DEBUG} = 1 }'."\n"
58 if $ENV{OBJECT_REMOTE_DEBUG};
59 $text .= <<'END';
60$INC{'Object/Remote/FatNode.pm'} = __FILE__;
61$Object::Remote::FatNode::DATA = <<'ENDFAT';
62END
63 $text .= $Object::Remote::FatNode::DATA;
64 $text .= "ENDFAT\n";
65 $text .= <<'END';
66eval $Object::Remote::FatNode::DATA;
67END
68 $text .= "__END__\n";
69 return $text;
70}
71
a9fdb55e 721;