comment the ::Next code a bit
[scpubgit/Tak-Daemon.git] / lib / Tak / Daemon / DaemonService.pm
CommitLineData
2bb8737c 1package Tak::Daemon::DaemonService;
2
3use POSIX;
4use Log::Contextual ();
5use Log::Contextual::SimpleLogger;
6use Tak::Router;
7use Moo;
8
9with 'Tak::Role::Service';
10
11has 'set_done_cb' => (is => 'rw');
12
13has 'router' => (is => 'lazy');
14
15sub _build_router { Tak::Router->new }
16
17sub handle_daemonize {
18 my ($self) = @_;
19 fork and exit;
20 POSIX::setsid or die "Couldn't setsid: $!";
21 fork and exit;
22 close STDERR;
23 open STDERR, '>', '/dev/null' or die "Couldn't re-open stderr: $!";
24 Log::Contextual::set_logger( # there's no NullLogger? I thought I wrote one
25 Log::Contextual::SimpleLogger->new({ levels => [] })
26 );
27 return 'done';
28}
29
30sub handle_become_successor {
31 my ($self) = @_;
32 my $done;
33 $self->set_done_cb(sub { $done = 1 });
9fcdac6d 34 # because this is funnier than "no warnings 'once'". Also because
35 # I don't have to stop and think "what else is in this lexical scope?"
2bb8737c 36 $Tak::STDIOSetup::Next = $Tak::STDIOSetup::Next = sub {
9fcdac6d 37 my $x = $self; # close over while evading void context warnings
2bb8737c 38 $0 = 'tak-daemon-node';
39 Tak->loop_until($done);
40 };
41 return 'done';
42}
43
44sub handle_shutdown {
45 my ($self) = @_;
46 $self->set_done_cb->();
47 return 'done';
48}
49
50sub start_router_request {
51 shift->router->start_request(@_);
52}
53
54sub receive_router {
55 shift->router->receive(@_);
56}
57
581;