fix parameters
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
CommitLineData
fc7ec1d9 1package Catalyst;
2
3use strict;
ac733264 4use base 'Catalyst::Base';
fc7ec1d9 5use UNIVERSAL::require;
6use Catalyst::Log;
42a57832 7use Catalyst::Helper;
0f7ecc53 8use Text::ASCIITable;
fc7ec1d9 9
424b2705 10__PACKAGE__->mk_classdata($_) for qw/dispatcher engine log/;
fc7ec1d9 11
87e67021 12our $VERSION = '5.00';
fc7ec1d9 13our @ISA;
14
15=head1 NAME
16
17Catalyst - The Elegant MVC Web Application Framework
18
19=head1 SYNOPSIS
20
21 # use the helper to start a new application
91864987 22 catalyst.pl MyApp
fc7ec1d9 23 cd MyApp
24
25 # add models, views, controllers
d01df17d 26 script/create.pl model Something
27 script/create.pl view Stuff
28 script/create.pl controller Yada
fc7ec1d9 29
30 # built in testserver
d01df17d 31 script/server.pl
fc7ec1d9 32
33 # command line interface
d01df17d 34 script/test.pl /yada
fc7ec1d9 35
36
fc7ec1d9 37 use Catalyst;
38
39 use Catalyst qw/My::Module My::OtherModule/;
40
41 use Catalyst '-Debug';
42
43 use Catalyst qw/-Debug -Engine=CGI/;
44
5a8ed4fe 45 sub default : Private { $_[1]->res->output('Hello') } );
46
e3dc9d78 47 sub index : Path('/index.html') {
5a8ed4fe 48 my ( $self, $c ) = @_;
49 $c->res->output('Hello');
50 $c->forward('_foo');
51 }
52
53 sub product : Regex('/^product[_]*(\d*).html$/') {
54 my ( $self, $c ) = @_;
55 $c->stash->{template} = 'product.tt';
56 $c->stash->{product} = $c->req->snippets->[0];
57 }
fc7ec1d9 58
3803e98f 59See also L<Catalyst::Manual::Intro>
60
fc7ec1d9 61=head1 DESCRIPTION
62
63Catalyst is based upon L<Maypole>, which you should consider for smaller
64projects.
65
66The key concept of Catalyst is DRY (Don't Repeat Yourself).
67
68See L<Catalyst::Manual> for more documentation.
69
23f9d934 70Catalyst plugins can be loaded by naming them as arguments to the "use Catalyst" statement.
1985c30b 71Omit the C<Catalyst::Plugin::> prefix from the plugin name,
23f9d934 72so C<Catalyst::Plugin::My::Module> becomes C<My::Module>.
fc7ec1d9 73
74 use Catalyst 'My::Module';
75
23f9d934 76Special flags like -Debug and -Engine can also be specifed as arguments when
77Catalyst is loaded:
fc7ec1d9 78
79 use Catalyst qw/-Debug My::Module/;
80
23f9d934 81The position of plugins and flags in the chain is important, because they are
82loaded in exactly the order that they appear.
fc7ec1d9 83
23f9d934 84The following flags are supported:
85
86=over 4
87
88=item -Debug
89
90enables debug output, i.e.:
fc7ec1d9 91
92 use Catalyst '-Debug';
93
23f9d934 94this is equivalent to:
fc7ec1d9 95
96 use Catalyst;
97 sub debug { 1 }
98
23f9d934 99=item -Engine
fc7ec1d9 100
101Force Catalyst to use a specific engine.
23f9d934 102Omit the C<Catalyst::Engine::> prefix of the engine name, i.e.:
fc7ec1d9 103
104 use Catalyst '-Engine=CGI';
105
23f9d934 106=back
fc7ec1d9 107
23f9d934 108=head1 METHODS
109
110=over 4
111
112=item debug
fc7ec1d9 113
114Overload to enable debug messages.
115
116=cut
117
118sub debug { 0 }
119
23f9d934 120=item config
fc7ec1d9 121
122Returns a hashref containing your applications settings.
123
124=cut
125
fc7ec1d9 126sub import {
127 my ( $self, @options ) = @_;
128 my $caller = caller(0);
129
99fe1710 130 # Prepare inheritance
22402712 131 unless ( $caller->isa($self) ) {
fc7ec1d9 132 no strict 'refs';
22402712 133 push @{"$caller\::ISA"}, $self;
1c99e125 134 }
135
d96e14c2 136 if ( $caller->engine ) {
42a57832 137 return; # Catalyst is already initialized
d96e14c2 138 }
139
32620e3e 140 unless ( $caller->log ) {
141 $caller->log( Catalyst::Log->new );
fc7ec1d9 142 }
fc7ec1d9 143
99fe1710 144 # Debug?
1985c30b 145 if ( $ENV{CATALYST_DEBUG} || $ENV{ uc($caller) . '_DEBUG' } ) {
146 no strict 'refs';
147 *{"$caller\::debug"} = sub { 1 };
148 $caller->log->debug('Debug messages enabled');
149 }
150
424b2705 151 my $engine = 'Catalyst::Engine::CGI';
152 my $dispatcher = 'Catalyst::Dispatcher';
6dc87a0f 153
99fe1710 154 # Detect mod_perl
6dc87a0f 155 if ( $ENV{MOD_PERL} ) {
156
157 require mod_perl;
158
159 if ( $mod_perl::VERSION >= 1.99 ) {
111728e3 160 $engine = 'Catalyst::Engine::Apache::MP19';
6dc87a0f 161 }
162 else {
111728e3 163 $engine = 'Catalyst::Engine::Apache::MP13';
6dc87a0f 164 }
165 }
1985c30b 166
42a57832 167 $caller->log->info("You are running an old helper script! ".
168 "Please update your scripts by regenerating the ".
169 "application and copying over the new scripts.")
170 if ( $ENV{CATALYST_SCRIPT_GEN} && (
171 $ENV{CATALYST_SCRIPT_GEN} <
172 $Catalyst::Helper::CATALYST_SCRIPT_GEN )) ;
99fe1710 173 # Process options
937fcdd8 174 my @plugins;
fc7ec1d9 175 foreach (@options) {
99fe1710 176
fc7ec1d9 177 if (/^\-Debug$/) {
1985c30b 178 next if $caller->debug;
fc7ec1d9 179 no strict 'refs';
1c99e125 180 *{"$caller\::debug"} = sub { 1 };
fc7ec1d9 181 $caller->log->debug('Debug messages enabled');
182 }
99fe1710 183
424b2705 184 elsif (/^-Dispatcher=(.*)$/) {
185 $dispatcher = "Catalyst::Dispatcher::$1";
186 }
99fe1710 187
fc7ec1d9 188 elsif (/^-Engine=(.*)$/) { $engine = "Catalyst::Engine::$1" }
189 elsif (/^-.*$/) { $caller->log->error(qq/Unknown flag "$_"/) }
99fe1710 190
fc7ec1d9 191 else {
192 my $plugin = "Catalyst::Plugin::$_";
193
c4695f3a 194 $plugin->require;
91dc9907 195
f88238ea 196 if ($@) { die qq/Couldn't load plugin "$plugin", "$@"/ }
fc7ec1d9 197 else {
f5f84847 198 push @plugins, $plugin;
502619e5 199 no strict 'refs';
200 push @{"$caller\::ISA"}, $plugin;
fc7ec1d9 201 }
202 }
99fe1710 203
fc7ec1d9 204 }
99fe1710 205
206 # Plugin table
d2d570d4 207 my $t = Text::ASCIITable->new( { hide_HeadRow => 1, hide_HeadLine => 1 } );
0f7ecc53 208 $t->setCols('Class');
0822f9a4 209 $t->setColWidth( 'Class', 75, 1 );
cd677e12 210 $t->addRow($_) for @plugins;
0f7ecc53 211 $caller->log->debug( 'Loaded plugins', $t->draw )
937fcdd8 212 if ( @plugins && $caller->debug );
fc7ec1d9 213
214 # Engine
215 $engine = "Catalyst::Engine::$ENV{CATALYST_ENGINE}"
216 if $ENV{CATALYST_ENGINE};
d96e14c2 217
fc7ec1d9 218 $engine->require;
219 die qq/Couldn't load engine "$engine", "$@"/ if $@;
502619e5 220 {
221 no strict 'refs';
970cc51d 222 push @{"$caller\::ISA"}, $engine;
502619e5 223 }
70cb38f0 224 $caller->engine($engine);
fc7ec1d9 225 $caller->log->debug(qq/Loaded engine "$engine"/) if $caller->debug;
424b2705 226
227 # Dispatcher
228 $dispatcher = "Catalyst::Dispatcher::$ENV{CATALYST_DISPATCHER}"
229 if $ENV{CATALYST_DISPATCHER};
230
231 $dispatcher->require;
232 die qq/Couldn't load dispatcher "$dispatcher", "$@"/ if $@;
233 {
234 no strict 'refs';
235 push @{"$caller\::ISA"}, $dispatcher;
236 }
237 $caller->dispatcher($dispatcher);
238 $caller->log->debug(qq/Loaded dispatcher "$dispatcher"/) if $caller->debug;
239
fc7ec1d9 240}
241
70cb38f0 242=item $c->engine
243
244Contains the engine class.
245
145074c2 246=item $c->log
247
248Contains the logging object. Unless it is already set Catalyst sets this up with a
249C<Catalyst::Log> object. To use your own log class:
250
251 $c->log( MyLogger->new );
252 $c->log->info("now logging with my own logger!");
253
254Your log class should implement the methods described in the C<Catalyst::Log>
255man page.
256
257
23f9d934 258=back
259
d1a31ac6 260=head1 LIMITATIONS
261
262FCGI and mod_perl2 support are considered experimental and may contain bugs.
263
264You may encounter problems accessing the built in test server on public ip
265addresses on the internet, thats because of a bug in HTTP::Daemon.
266
3cb1db8c 267=head1 SUPPORT
268
269IRC:
270
271 Join #catalyst on irc.perl.org.
272
273Mailing-Lists:
274
275 http://lists.rawmode.org/mailman/listinfo/catalyst
276 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
1985c30b 277
fc7ec1d9 278=head1 SEE ALSO
279
61b1e958 280=over 4
281
282=item L<Catalyst::Manual> - The Catalyst Manual
283
284=item L<Catalyst::Engine> - Core Engine
285
286=item L<Catalyst::Log> - The Log Class.
287
288=item L<Catalyst::Request> - The Request Object
289
290=item L<Catalyst::Response> - The Response Object
291
292=item L<Catalyst::Test> - The test suite.
293
294=back
fc7ec1d9 295
296=head1 AUTHOR
297
298Sebastian Riedel, C<sri@oook.de>
299
300=head1 THANK YOU
301
bc024080 302Andrew Ford, Andrew Ruthven, Christian Hansen, Christopher Hicks,
b0b7c5e0 303Dan Sully, Danijel Milicevic, David Naughton, Gary Ashton Jones,
304Jesse Sheidlower, Johan Lindstrom, Marcus Ramberg, Tatsuhiko Miyagawa
305and all the others who've helped.
fc7ec1d9 306
307=head1 LICENSE
308
309This library is free software . You can redistribute it and/or modify it under
310the same terms as perl itself.
311
312=cut
313
3141;