1 package App::Clifton::Server;
3 use aliased 'App::Clifton::ConsoleService';
4 use aliased 'App::Clifton::ConfigLoader';
5 use aliased 'App::Clifton::Tower::Jabber' => 'Jabber_Tower';
6 use aliased 'App::Clifton::Tower::IRC' => 'IRC_Tower';
9 extends 'App::Clifton::Service';
12 my ($self, $args) = @_;
13 $args->{loop}->add($self);
14 $self->$_ for qw(console_service);
17 has config_file => (is => 'ro', required => 1);
19 has config_loader => (is => 'lazy');
21 has current_config => (is => 'rw');
23 sub _build_config_loader { ConfigLoader->new }
25 has console_service => (is => 'lazy');
27 has jabber_towers => (is => 'ro', default => sub { {} });
29 has irc_towers => (is => 'ro', default => sub { {} });
31 sub _build_console_service {
33 $self->_new_child(ConsoleService, { server => $self });
36 sub reload_config { shift->_do(reload_config => @_) }
37 sub shutdown { shift->_do(shutdown => @_) }
39 sub _body_for_reload_config {
40 my ($self, $args) = @_;
41 my $config = $self->config_loader->config_from_file($self->config_file);
42 $self->current_config($config);
43 $args->{on_finished}->($config);
46 sub start_chain { shift->_do(start_chain => @_) }
48 sub _dependencies_for_start_chain {
49 my ($self, $args) = @_;
51 irc_tower => $self->start_irc_tower($args->{irc_tower})
55 sub _body_for_start_chain {
56 my ($self, $args) = @_;
57 $args->{irc_tower}->start_chain($args);
60 sub start_irc_tower { shift->_do(start_irc_tower => @_) }
62 sub _guard_for_start_irc_tower {
63 my ($self, $args) = @_;
64 if (my $tower = $self->irc_towers->{$args->{server}}{$args->{irc_nick}}) {
71 sub _body_for_start_irc_tower {
72 my ($self, $args) = @_;
73 $self->_new_child(IRC_Tower, {
74 irc_server => $args->{server},
75 irc_nick => $args->{irc_nick},
76 on_setup => $args->{on_finished},