49db7ca6b3c4e23f4217849a43532affc3656e3d
[scpubgit/Tak.git] / lib / Tak / World.pm
1 package Tak::World;
2
3 use Tak::JSONChannel;
4 use Tak::ServiceManager;
5 use Tak::EvalService;
6 use Tak::ModuleLoader;
7 use Tak::Router;
8 use Tak::Remote;
9
10 use Moo;
11
12 has channel_args => (is => 'ro', required => 1);
13
14 sub new_from_stdio {
15   open my $stdin, '<&', \*STDIN;
16   open my $stdout, '>&', \*STDOUT;
17   shift->new(channel_args => { read_fh => $stdin, write_fh => $stdout });
18 }
19
20 has router => (is => 'lazy');
21
22 sub _build_router {
23   my ($self) = @_;
24   my $channel = Tak::JSONChannel->new($self->channel_args);
25
26   my $router = Tak::Router->new(
27     channel => $channel
28   );
29   
30   $router->register(EVAL => Tak::EvalService->new);
31   
32   my $remote = Tak::Remote->new(
33     router => $router,
34     name => 'MODULE_SENDER'
35   );
36   
37   my $loader = Tak::ModuleLoader->new(
38     remote => $remote
39   );
40   
41   unshift @INC, $loader->inc_callback;
42   
43   return $router;
44 }
45
46 sub run { shift->router->run }
47   
48 1;