Commit | Line | Data |
291722a8 |
1 | package Catalyst::ScriptRunner; |
2 | use Moose; |
12a3e3b5 |
3 | use FindBin; |
4 | use lib; |
5 | use File::Spec; |
725afced |
6 | use Class::Load qw/ load_first_existing_class load_optional_class /; |
7f2e015b |
7 | use namespace::autoclean -also => 'subclass_with_traits'; |
8 | use Try::Tiny; |
9 | |
10 | sub find_script_class { |
11 | my ($self, $app, $script) = @_; |
725afced |
12 | return load_first_existing_class("${app}::Script::${script}", "Catalyst::Script::$script"); |
7f2e015b |
13 | } |
14 | |
15 | sub find_script_traits { |
16 | my ($self, @try) = @_; |
17 | |
725afced |
18 | return grep { load_optional_class($_) } @try; |
7f2e015b |
19 | } |
20 | |
21 | sub subclass_with_traits { |
22 | my ($base, @traits) = @_; |
23 | |
24 | my $meta = Class::MOP::class_of($base)->create_anon_class( |
25 | superclasses => [ $base ], |
26 | roles => [ @traits ], |
27 | cache => 1, |
28 | ); |
29 | $meta->add_method(meta => sub { $meta }); |
30 | |
31 | return $meta->name; |
32 | } |
291722a8 |
33 | |
cc999ce2 |
34 | sub run { |
7f2e015b |
35 | my ($self, $appclass, $scriptclass) = @_; |
c1c59374 |
36 | |
12a3e3b5 |
37 | lib->import(File::Spec->catdir($FindBin::Bin, '..', 'lib')); |
38 | |
7f2e015b |
39 | my $class = $self->find_script_class($appclass, $scriptclass); |
40 | |
41 | my @possible_traits = ("${appclass}::TraitFor::Script::${scriptclass}", "${appclass}::TraitFor::Script"); |
42 | my @traits = $self->find_script_traits(@possible_traits); |
43 | |
44 | $class = subclass_with_traits($class, @traits) |
45 | if @traits; |
46 | |
47 | $class->new_with_options( application_name => $appclass )->run; |
cc999ce2 |
48 | } |
d3082fac |
49 | |
50 | __PACKAGE__->meta->make_immutable; |
51 | |
52 | =head1 NAME |
53 | |
1628b022 |
54 | Catalyst::ScriptRunner - The Catalyst Framework script runner |
d3082fac |
55 | |
56 | =head1 SYNOPSIS |
57 | |
1628b022 |
58 | # Will run MyApp::Script::Server if it exists, otherwise |
59 | # will run Catalyst::Script::Server. |
60 | Catalyst::ScriptRunner->run('MyApp', 'Server'); |
d3082fac |
61 | |
62 | =head1 DESCRIPTION |
63 | |
383c5be6 |
64 | This class is responsible for loading and running scripts, either in the application specific namespace |
65 | (e.g. C<MyApp::Script::Server>), or the Catalyst namespace (e.g. C<Catalyst::Script::Server>). |
66 | |
67 | If your application contains a custom script, then it will be used in preference to the generic |
68 | script, and is expected to sub-class the standard script. |
69 | |
70 | =head1 TRAIT LOADING |
71 | |
72 | Catalyst will automatically load and apply roles to the scripts in your appliction. |
73 | |
74 | C<MyApp::TraitFor::Script> will be loaded if present, and will be applied to B<ALL> |
75 | scripts. |
76 | |
77 | C<MyApp::TraitFor::Script::XXXX> will be loaded (if present) and for script |
78 | individually. |
d3082fac |
79 | |
12aa6ca4 |
80 | =head1 METHODS |
81 | |
82 | =head2 run ($application_class, $scriptclass) |
83 | |
bb48c556 |
84 | Called with two parameters, the application class (e.g. MyApp) |
12aa6ca4 |
85 | and the script class, (i.e. one of Server/FastCGI/CGI/Create/Test) |
86 | |
d3082fac |
87 | =head1 AUTHORS |
88 | |
89 | Catalyst Contributors, see Catalyst.pm |
90 | |
91 | =head1 COPYRIGHT |
92 | |
93 | This library is free software. You can redistribute it and/or modify it under |
94 | the same terms as Perl itself. |
95 | |
96 | =cut |