create world object, repl script
[scpubgit/Tak.git] / lib / Tak / World.pm
CommitLineData
8b6c1f59 1package Tak::World;
2
3use Tak::JSONChannel;
4use Tak::ServiceManager;
5use Tak::EvalService;
6use Tak::ModuleLoader;
7use Tak::Router;
8use Tak::Remote;
9
10use Moo;
11
12has channel_args => (is => 'ro', required => 1);
13
14sub 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
20has router => (is => 'lazy');
21
22sub _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
46sub run { shift->router->run }
47
481;