initial import of App::SCS code
[scpubgit/App-SCS.git] / lib / App / SCS.pm
1 package App::SCS;
2
3 use Module::Runtime qw(use_module);
4 use IO::All;
5 use Moo;
6
7 with 'App::SCS::Role::WithConfig';
8
9 has plugins => (is => 'ro', default => sub { [] });
10
11 has pages => (is => 'lazy');
12
13 sub _build_pages {
14   my ($self) = @_;
15   return use_module('App::SCS::PageSet')->new(
16     base_dir => io->dir($self->config->{share_dir})->catdir('pages'),
17     plugin_config => {
18       plugin_map => {
19         map $_->page_plugins, reverse @{$self->plugins}
20       },
21       defaults => [
22         map $_->default_page_plugins, @{$self->plugins}
23       ],
24     }
25   );
26 }
27
28 has web => (is => 'lazy');
29
30 sub _build_web {
31   my ($self) = @_;
32   return use_module('App::SCS::Web')->new(
33     app => $self
34   );
35 }
36
37 sub BUILD {
38   my ($self) = @_;
39   $self->load_plugin(Core => {});
40   foreach my $spec (@{$self->config->{plugins}||[]}) {
41     $self->load_plugin(@$spec);
42   }
43 }
44
45 sub load_plugin {
46   my ($self, $name, $config) = @_;
47   push(
48     @{$self->plugins},
49     use_module("App::SCS::Plugin::${name}")->new(
50       app => $self,
51       config => $config
52     )
53   );
54   return;
55 }
56
57 1;