compat fix for IO::All 0.47+
[scpubgit/App-SCS.git] / lib / App / SCS.pm
CommitLineData
632f0e07 1package App::SCS;
2
3use Module::Runtime qw(use_module);
4use IO::All;
5use Moo;
6
7with 'App::SCS::Role::WithConfig';
8
9has plugins => (is => 'ro', default => sub { [] });
10
0034f151 11has root_dir => (is => 'lazy');
12
13sub _build_root_dir {
14 my ($self) = @_;
f6e34d3c 15 # Need to pass '.' rather than undef in the default case - otherwise
16 # IO::All 0.47+ resolves to / (previously undef or '' was '.')
17 io->dir(io->dir($self->config->{root_dir}||'.')->absolute);
0034f151 18}
19
20has share_dir => (is => 'lazy');
21
22sub _build_share_dir {
23 my ($self) = @_;
24 io->dir($self->config->{share_dir}||$self->root_dir->catdir('share'));
25}
26
27has page_plugin_config => (is => 'lazy');
28
29sub _build_page_plugin_config {
30 my ($self) = @_;
31 return {
32 plugin_map => {
33 do {
34 my %map = map $_->page_plugins, reverse @{$self->plugins};
35 ref($_) or $_ = { class => $_, config => sub {} } for values %map;
36 %map;
37 }
38 },
39 defaults => [
40 map $_->default_page_plugins, @{$self->plugins}
41 ],
42 };
43}
44
632f0e07 45has pages => (is => 'lazy');
46
47sub _build_pages {
48 my ($self) = @_;
49 return use_module('App::SCS::PageSet')->new(
0034f151 50 base_dir => $self->share_dir->catdir('pages'),
51 plugin_config => $self->page_plugin_config,
632f0e07 52 );
53}
54
55has web => (is => 'lazy');
56
57sub _build_web {
58 my ($self) = @_;
59 return use_module('App::SCS::Web')->new(
60 app => $self
61 );
62}
63
64sub BUILD {
65 my ($self) = @_;
66 $self->load_plugin(Core => {});
f50b4a35 67 my @plist = @{$self->config->{plugins}||[]};
68 while (my ($name, $conf) = splice @plist, 0, 2) {
69 $self->load_plugin($name, $conf);
632f0e07 70 }
71}
72
73sub load_plugin {
74 my ($self, $name, $config) = @_;
18968192 75 my $class = ($name =~ s/^\+// ? $name : "App::SCS::Plugin::${name}");
632f0e07 76 push(
77 @{$self->plugins},
18968192 78 use_module($class)->new(
632f0e07 79 app => $self,
80 config => $config
81 )
82 );
83 return;
84}
85
f50b4a35 86sub run_if_script {
87 my $self = shift;
88 if (caller(1)) {
2d08e5ba 89 my $code;
90 return sub {
91 $code ||= $self->web->to_psgi_app;
92 &$code
93 };
f50b4a35 94 } else {
95 return $self->run;
96 }
97}
98
99sub run {
100 my $self = shift;
101 my $env = {
102 argv => \@ARGV,
103 stdin => \*STDIN,
104 stdout => \*STDOUT,
105 stderr => \*STDERR,
106 };
107 foreach my $p (@{$self->plugins}) {
108 return if $p->run_cli($env);
109 }
110 $self->web->run;
111}
112
632f0e07 1131;