propagate debug flag over ssh
[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 has module_sender => (is => 'lazy');
12
13 sub _build_module_sender {
14   my ($hook) =
15     grep {blessed($_) && $_->isa('Object::Remote::ModuleLoader::Hook') }
16       @INC;
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(@_);
23   Object::Remote::Handle->new(
24     connection => $conn,
25     class => 'Object::Remote::ModuleLoader',
26     args => { module_sender => $self->module_sender }
27   )->disarm_free;
28   return $conn;
29 };
30
31 sub _perl_command { 'perl', '-' }
32
33 sub _start_perl {
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]': $!";
40   return ($foreign_stdin, $foreign_stdout, $pid);
41 }
42
43 sub _open2_for {
44   my $self = shift;
45   my ($foreign_stdin, $foreign_stdout, $pid) = $self->_start_perl(@_);
46   require Object::Remote::FatNode;
47   print $foreign_stdin 'BEGIN { $ENV{OBJECT_REMOTE_DEBUG} = 1 }'."\n"
48     if $ENV{OBJECT_REMOTE_DEBUG};
49   print $foreign_stdin $Object::Remote::FatNode::DATA, "__END__\n"
50     or die "Failed to send fatpacked data to new node on '$_[0]': $!";
51   return ($foreign_stdin, $foreign_stdout, $pid);
52 }
53
54 1;