Work towards supporting psgi.
[catagits/Catalyst-Runtime.git] / lib / Catalyst / ScriptRole.pm
1 package Catalyst::ScriptRole;
2 use Moose::Role;
3 use Plack::Runner;
4 use MooseX::Types::Moose qw/Str Bool/;
5 use Pod::Usage;
6 use MooseX::Getopt;
7 use namespace::autoclean;
8
9 with 'MooseX::Getopt' => {
10     excludes => [qw/
11         _getopt_spec_warnings
12         _getopt_spec_exception
13         _getopt_full_usage
14     /],
15 };
16
17 has application_name => (
18     traits   => ['NoGetopt'],
19     isa      => Str,
20     is       => 'ro',
21     required => 1,
22 );
23
24 has help => (
25     traits        => ['Getopt'],
26     isa           => Bool,
27     is            => 'ro',
28     documentation => 'Display this help and exit',
29     cmd_aliases   => ['?', 'h'],
30 );
31
32 sub _getopt_spec_exception {}
33
34 sub _getopt_spec_warnings {
35     shift;
36     warn @_;
37 }
38
39 sub _getopt_full_usage {
40     my $self = shift;
41     pod2usage();
42     exit 0;
43 }
44
45 before run => sub {
46     my $self = shift;
47     $self->_getopt_full_usage if $self->help;
48 };
49
50 sub run {
51     my $self = shift;
52     $self->_run_application;
53 }
54
55 sub _application_args {
56     ()
57 }
58
59 sub _run_application {
60     my $self = shift;
61     my $app = $self->application_name;
62     Class::MOP::load_class($app);
63     my $psgi_app = $app->run($self->_application_args);
64     Plack::Runner->run('--app' => $psgi_app);
65 }
66
67 1;
68
69 =head1 NAME
70
71 Catalyst::ScriptRole - Common functionality for Catalyst scripts.
72
73 =head1 SYNOPSIS
74
75     package MyApp::Script::Foo;
76     use Moose;
77     use namespace::autoclean;
78
79     with 'Catalyst::ScriptRole';
80
81     sub _application_args { ... }
82
83 =head1 DESCRIPTION
84
85 Role with the common functionality of Catalyst scripts.
86
87 =head1 METHODS
88
89 =head2 run
90
91 The method invoked to run the application.
92
93 =head1 ATTRIBUTES
94
95 =head2 application_name
96
97 The name of the application class, e.g. MyApp
98
99 =head1 SEE ALSO
100
101 L<Catalyst>
102
103 L<MooseX::Getopt>
104
105 =head1 AUTHORS
106
107 Catalyst Contributors, see Catalyst.pm
108
109 =head1 COPYRIGHT
110
111 This library is free software, you can redistribute it and/or modify
112 it under the same terms as Perl itself.
113
114 =cut