switch object client to new code
[scpubgit/Tak.git] / lib / Tak / WorldHandle.pm
CommitLineData
8b6c1f59 1package Tak::WorldHandle;
2
3use IPC::Open2 ();
4use Tak::Router;
5use Tak::JSONChannel;
6use Tak::ModuleSender;
7use Tak::Remote;
8use IO::All;
9use Moo;
10
11sub Tak::WorldHandle::_local::open2 {
12 shift;
13 my $pid = IPC::Open2::open2(my $out, my $in, @_)
14 or die "Couldn't open2 child: $!";
15 return ($in, $out, $pid);
16}
17
18has connection => (is => 'ro', required => 1);
19
20sub new_local {
21 shift->new(connection => bless({}, 'Tak::WorldHandle::_local'))
22}
23
24sub new_remote {
25 my ($class, $target) = @_;
26 $class->new(connection => do {
27 require Net::OpenSSH;
28 Net::OpenSSH->new($target);
29 });
30}
31
32has router => (is => 'lazy');
33
34sub _build_router {
35 my ($self) = @_;
36
37 my ($stdin, $stdout) = $self->connection->open2('perl -');
38
6fd39562 39 $stdin->print(io('maint/mk-fat |')->all, "__END__\n");
8b6c1f59 40
41 my $channel = Tak::JSONChannel->new(
42 read_fh => $stdout, write_fh => $stdin
43 );
44
45 my $router = Tak::Router->new(
46 channel => $channel
47 );
48
857f4834 49 $router->register(module_sender => Tak::ModuleSender->new);
8b6c1f59 50
51 return $router;
52}
53
54sub remote_for {
55 my ($self, $name) = @_;
56 Tak::Remote->new(router => $self->router, name => $name);
57}
58
591;