working automatic prompting
[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;
1b315002 29 require Object::Remote::Prompt;
30 Object::Remote::Prompt::maybe_set_prompt_command_on($conn);
a9fdb55e 31 return $conn;
32};
33
34sub _perl_command { 'perl', '-' }
35
7efea51f 36sub _start_perl {
a9fdb55e 37 my $self = shift;
38 my $pid = open2(
39 my $foreign_stdout,
40 my $foreign_stdin,
41 $self->_perl_command(@_),
42 ) or die "Failed to run perl at '$_[0]': $!";
7efea51f 43 return ($foreign_stdin, $foreign_stdout, $pid);
44}
45
46sub _open2_for {
47 my $self = shift;
48 my ($foreign_stdin, $foreign_stdout, $pid) = $self->_start_perl(@_);
4c8c83d7 49 $foreign_stdin->autoflush(1);
a8ac86b5 50 print $foreign_stdin 'BEGIN { $ENV{OBJECT_REMOTE_DEBUG} = 1 }'."\n"
51 if $ENV{OBJECT_REMOTE_DEBUG};
b1cbd5be 52 print $foreign_stdin $self->fatnode_text
18e789ab 53 or die "Failed to send fatpacked data to new node on '$_[0]': $!";
a9fdb55e 54 return ($foreign_stdin, $foreign_stdout, $pid);
55}
56
b1cbd5be 57sub fatnode_text {
58 my ($self) = @_;
59 require Object::Remote::FatNode;
60 my $text = '';
61 $text .= 'BEGIN { $ENV{OBJECT_REMOTE_DEBUG} = 1 }'."\n"
62 if $ENV{OBJECT_REMOTE_DEBUG};
63 $text .= <<'END';
64$INC{'Object/Remote/FatNode.pm'} = __FILE__;
65$Object::Remote::FatNode::DATA = <<'ENDFAT';
66END
67 $text .= $Object::Remote::FatNode::DATA;
68 $text .= "ENDFAT\n";
69 $text .= <<'END';
70eval $Object::Remote::FatNode::DATA;
71END
72 $text .= "__END__\n";
73 return $text;
74}
75
a9fdb55e 761;