Commit | Line | Data |
20038dd8 |
1 | package App::Clifton::Component; |
2 | |
3 | # define this up here to avoid uninitialised warnings |
4 | sub _debug_self { |
5 | my ($self, $args) = @_; |
6 | "${self}: ".join ', ', map "$_ => ".$args->{$_}, keys %$args; |
7 | } |
8 | |
9 | use Log::Contextual qw(:log); |
10 | use Moo; |
11 | |
d3a0b2ab |
12 | extends 'Moo::Object', 'IO::Async::Notifier'; |
13 | |
14 | # we're replacing Notifier's constructor so need to set up its default |
15 | has children => (is => 'bare', default => sub { [] }); |
20038dd8 |
16 | |
17 | sub BUILD { |
18 | my ($self, $args) = @_; |
19 | log_debug { |
20 | "Constructing "._debug_self($self, $args); |
21 | }; |
22 | if (my $parent = $args->{parent_component}) { |
23 | $parent->add_child($self); |
24 | } |
25 | } |
26 | |
20038dd8 |
27 | sub _new_child { |
28 | my ($self, $class, $args) = @_; |
8b2081ac |
29 | if ($class->isa('App::Clifton::Component')) { |
30 | $class->new(%{$args||{}}, parent_component => $self); |
31 | } else { |
32 | my $new = $class->new(%{$args||{}}); |
33 | $self->add_child($new); |
34 | $new; |
35 | } |
20038dd8 |
36 | } |
37 | |
38 | sub _schedule { |
39 | my ($self, $code) = @_; |
40 | $self->get_loop->later($code); |
41 | } |
42 | |
43 | sub DESTROY { |
44 | my ($self) = @_; |
45 | log_debug { "Destroying "._debug_self($self, $self) }; |
46 | } |
47 | |
48 | 1; |