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