release
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
CommitLineData
fc7ec1d9 1package Catalyst;
2
3use strict;
4use base 'Class::Data::Inheritable';
5use UNIVERSAL::require;
6use Catalyst::Log;
7
8__PACKAGE__->mk_classdata($_) for qw/_config log/;
9
1c99e125 10our $VERSION = '4.31';
fc7ec1d9 11our @ISA;
12
13=head1 NAME
14
15Catalyst - The Elegant MVC Web Application Framework
16
17=head1 SYNOPSIS
18
19 # use the helper to start a new application
91864987 20 catalyst.pl MyApp
fc7ec1d9 21 cd MyApp
22
23 # add models, views, controllers
d01df17d 24 script/create.pl model Something
25 script/create.pl view Stuff
26 script/create.pl controller Yada
fc7ec1d9 27
28 # built in testserver
d01df17d 29 script/server.pl
fc7ec1d9 30
31 # command line interface
d01df17d 32 script/test.pl /yada
fc7ec1d9 33
34
fc7ec1d9 35 use Catalyst;
36
37 use Catalyst qw/My::Module My::OtherModule/;
38
39 use Catalyst '-Debug';
40
41 use Catalyst qw/-Debug -Engine=CGI/;
42
43 __PACKAGE__->action( '!default' => sub { $_[1]->res->output('Hello') } );
44
45 __PACKAGE__->action(
46 'index.html' => sub {
47 my ( $self, $c ) = @_;
48 $c->res->output('Hello');
49 $c->forward('_foo');
50 }
51 );
52
53 __PACKAGE__->action(
54 '/^product[_]*(\d*).html$/' => sub {
55 my ( $self, $c ) = @_;
56 $c->stash->{template} = 'product.tt';
57 $c->stash->{product} = $c->req->snippets->[0];
58 }
59 );
60
3803e98f 61See also L<Catalyst::Manual::Intro>
62
fc7ec1d9 63=head1 DESCRIPTION
64
65Catalyst is based upon L<Maypole>, which you should consider for smaller
66projects.
67
68The key concept of Catalyst is DRY (Don't Repeat Yourself).
69
70See L<Catalyst::Manual> for more documentation.
71
23f9d934 72Catalyst plugins can be loaded by naming them as arguments to the "use Catalyst" statement.
73Omit the C<Catalyst::Plugin::> prefix from the plugin name,
74so C<Catalyst::Plugin::My::Module> becomes C<My::Module>.
fc7ec1d9 75
76 use Catalyst 'My::Module';
77
23f9d934 78Special flags like -Debug and -Engine can also be specifed as arguments when
79Catalyst is loaded:
fc7ec1d9 80
81 use Catalyst qw/-Debug My::Module/;
82
23f9d934 83The position of plugins and flags in the chain is important, because they are
84loaded in exactly the order that they appear.
fc7ec1d9 85
23f9d934 86The following flags are supported:
87
88=over 4
89
90=item -Debug
91
92enables debug output, i.e.:
fc7ec1d9 93
94 use Catalyst '-Debug';
95
23f9d934 96this is equivalent to:
fc7ec1d9 97
98 use Catalyst;
99 sub debug { 1 }
100
23f9d934 101=item -Engine
fc7ec1d9 102
103Force Catalyst to use a specific engine.
23f9d934 104Omit the C<Catalyst::Engine::> prefix of the engine name, i.e.:
fc7ec1d9 105
106 use Catalyst '-Engine=CGI';
107
23f9d934 108=back
fc7ec1d9 109
23f9d934 110=head1 METHODS
111
112=over 4
113
114=item debug
fc7ec1d9 115
116Overload to enable debug messages.
117
118=cut
119
120sub debug { 0 }
121
23f9d934 122=item config
fc7ec1d9 123
124Returns a hashref containing your applications settings.
125
126=cut
127
128sub config {
129 my $self = shift;
130 $self->_config( {} ) unless $self->_config;
131 if ( $_[0] ) {
132 my $config = $_[1] ? {@_} : $_[0];
133 while ( my ( $key, $val ) = each %$config ) {
134 $self->_config->{$key} = $val;
135 }
136 }
137 return $self->_config;
138}
139
140sub import {
141 my ( $self, @options ) = @_;
142 my $caller = caller(0);
143
144 # Class
145 {
146 no strict 'refs';
147 *{"$caller\::handler"} =
148 sub { Catalyst::Engine::handler( $caller, @_ ) };
1c99e125 149
150 unless ( $caller->isa($self) ) {
151 push @{"$caller\::ISA"}, $self;
152 }
153 }
154
155 unless ( $self->log ) {
156 $self->log( Catalyst::Log->new );
fc7ec1d9 157 }
fc7ec1d9 158
159 # Options
160 my $engine =
161 $ENV{MOD_PERL} ? 'Catalyst::Engine::Apache' : 'Catalyst::Engine::CGI';
162 foreach (@options) {
163 if (/^\-Debug$/) {
164 no warnings;
165 no strict 'refs';
1c99e125 166 *{"$caller\::debug"} = sub { 1 };
fc7ec1d9 167 $caller->log->debug('Debug messages enabled');
168 }
169 elsif (/^-Engine=(.*)$/) { $engine = "Catalyst::Engine::$1" }
170 elsif (/^-.*$/) { $caller->log->error(qq/Unknown flag "$_"/) }
171 else {
172 my $plugin = "Catalyst::Plugin::$_";
173
174 # Plugin caller should be our application class
175 eval "package $caller; require $plugin";
176 if ($@) {
177 $caller->log->error(qq/Couldn't load plugin "$plugin", "$@"/);
178 }
179 else {
180 $caller->log->debug(qq/Loaded plugin "$plugin"/)
181 if $caller->debug;
502619e5 182 no strict 'refs';
183 push @{"$caller\::ISA"}, $plugin;
fc7ec1d9 184 }
185 }
186 }
187
188 # Engine
189 $engine = "Catalyst::Engine::$ENV{CATALYST_ENGINE}"
190 if $ENV{CATALYST_ENGINE};
191 $engine->require;
192 die qq/Couldn't load engine "$engine", "$@"/ if $@;
502619e5 193 {
194 no strict 'refs';
195 push @{"$caller\::ISA"}, $engine;
196 }
fc7ec1d9 197 $caller->log->debug(qq/Loaded engine "$engine"/) if $caller->debug;
198}
199
23f9d934 200=back
201
3cb1db8c 202=head1 SUPPORT
203
204IRC:
205
206 Join #catalyst on irc.perl.org.
207
208Mailing-Lists:
209
210 http://lists.rawmode.org/mailman/listinfo/catalyst
211 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
212
fc7ec1d9 213=head1 SEE ALSO
214
215L<Catalyst::Manual>, L<Catalyst::Test>, L<Catalyst::Request>,
216L<Catalyst::Response>, L<Catalyst::Engine>
217
218=head1 AUTHOR
219
220Sebastian Riedel, C<sri@oook.de>
221
222=head1 THANK YOU
223
bc024080 224Andrew Ford, Andrew Ruthven, Christian Hansen, Christopher Hicks,
225Danijel Milicevic, David Naughton, Gary Ashton Jones, Jesse Sheidlower,
226Johan Lindstrom, Marcus Ramberg, Tatsuhiko Miyagawa and all the others
227who've helped.
fc7ec1d9 228
229=head1 LICENSE
230
231This library is free software . You can redistribute it and/or modify it under
232the same terms as perl itself.
233
234=cut
235
2361;