BuildAll and DemolishAll are loaded on first ->new so need to be explicitly packed
[scpubgit/Object-Remote.git] / lib / Object / Remote / Role / Connector / PerlInterpreter.pm
CommitLineData
a9fdb55e 1package Object::Remote::Role::Connector::PerlInterpreter;
2
3use IPC::Open2;
4c8c83d7 4use IO::Handle;
a9fdb55e 5use Object::Remote::ModuleSender;
6use Object::Remote::Handle;
18e789ab 7use Scalar::Util qw(blessed);
a9fdb55e 8use Moo::Role;
9
10with 'Object::Remote::Role::Connector';
11
03f41c0e 12has module_sender => (is => 'lazy');
13
14sub _build_module_sender {
18e789ab 15 my ($hook) =
16 grep {blessed($_) && $_->isa('Object::Remote::ModuleLoader::Hook') }
17 @INC;
03f41c0e 18 return $hook ? $hook->sender : Object::Remote::ModuleSender->new;
19}
20
21around connect => sub {
22 my ($orig, $self) = (shift, shift);
23 my $conn = $self->$orig(@_);
a9fdb55e 24 Object::Remote::Handle->new(
25 connection => $conn,
26 class => 'Object::Remote::ModuleLoader',
03f41c0e 27 args => { module_sender => $self->module_sender }
a9fdb55e 28 )->disarm_free;
29 return $conn;
30};
31
32sub _perl_command { 'perl', '-' }
33
7efea51f 34sub _start_perl {
a9fdb55e 35 my $self = shift;
36 my $pid = open2(
37 my $foreign_stdout,
38 my $foreign_stdin,
39 $self->_perl_command(@_),
40 ) or die "Failed to run perl at '$_[0]': $!";
7efea51f 41 return ($foreign_stdin, $foreign_stdout, $pid);
42}
43
44sub _open2_for {
45 my $self = shift;
46 my ($foreign_stdin, $foreign_stdout, $pid) = $self->_start_perl(@_);
4c8c83d7 47 $foreign_stdin->autoflush(1);
a8ac86b5 48 print $foreign_stdin 'BEGIN { $ENV{OBJECT_REMOTE_DEBUG} = 1 }'."\n"
49 if $ENV{OBJECT_REMOTE_DEBUG};
b1cbd5be 50 print $foreign_stdin $self->fatnode_text
18e789ab 51 or die "Failed to send fatpacked data to new node on '$_[0]': $!";
a9fdb55e 52 return ($foreign_stdin, $foreign_stdout, $pid);
53}
54
b1cbd5be 55sub fatnode_text {
56 my ($self) = @_;
57 require Object::Remote::FatNode;
58 my $text = '';
59 $text .= 'BEGIN { $ENV{OBJECT_REMOTE_DEBUG} = 1 }'."\n"
60 if $ENV{OBJECT_REMOTE_DEBUG};
61 $text .= <<'END';
62$INC{'Object/Remote/FatNode.pm'} = __FILE__;
63$Object::Remote::FatNode::DATA = <<'ENDFAT';
64END
65 $text .= $Object::Remote::FatNode::DATA;
66 $text .= "ENDFAT\n";
67 $text .= <<'END';
68eval $Object::Remote::FatNode::DATA;
69END
70 $text .= "__END__\n";
71 return $text;
72}
73
a9fdb55e 741;