removed chansen from makefile, since he has no sense of humor
[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;
0f7ecc53 7use Text::ASCIITable;
55c388c1 8use Text::ASCIITable::Wrap 'wrap';
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
22402712 130 unless ( $caller->isa($self) ) {
fc7ec1d9 131 no strict 'refs';
22402712 132 push @{"$caller\::ISA"}, $self;
1c99e125 133 }
134
d96e14c2 135 if ( $caller->engine ) {
ac733264 136 return; # Catalyst is allready initialized
d96e14c2 137 }
138
32620e3e 139 unless ( $caller->log ) {
140 $caller->log( Catalyst::Log->new );
fc7ec1d9 141 }
fc7ec1d9 142
1985c30b 143 if ( $ENV{CATALYST_DEBUG} || $ENV{ uc($caller) . '_DEBUG' } ) {
144 no strict 'refs';
145 *{"$caller\::debug"} = sub { 1 };
146 $caller->log->debug('Debug messages enabled');
147 }
148
424b2705 149 my $engine = 'Catalyst::Engine::CGI';
150 my $dispatcher = 'Catalyst::Dispatcher';
6dc87a0f 151
152 if ( $ENV{MOD_PERL} ) {
153
154 require mod_perl;
155
156 if ( $mod_perl::VERSION >= 1.99 ) {
91dc9907 157 $engine = 'Catalyst::Engine::Apache::MP2';
6dc87a0f 158 }
159 else {
91dc9907 160 $engine = 'Catalyst::Engine::Apache::MP1';
6dc87a0f 161 }
162 }
1985c30b 163
937fcdd8 164 my @plugins;
fc7ec1d9 165 foreach (@options) {
166 if (/^\-Debug$/) {
1985c30b 167 next if $caller->debug;
fc7ec1d9 168 no strict 'refs';
1c99e125 169 *{"$caller\::debug"} = sub { 1 };
fc7ec1d9 170 $caller->log->debug('Debug messages enabled');
171 }
424b2705 172 elsif (/^-Dispatcher=(.*)$/) {
173 $dispatcher = "Catalyst::Dispatcher::$1";
174 }
fc7ec1d9 175 elsif (/^-Engine=(.*)$/) { $engine = "Catalyst::Engine::$1" }
176 elsif (/^-.*$/) { $caller->log->error(qq/Unknown flag "$_"/) }
177 else {
178 my $plugin = "Catalyst::Plugin::$_";
179
c4695f3a 180 $plugin->require;
91dc9907 181
fc7ec1d9 182 if ($@) {
183 $caller->log->error(qq/Couldn't load plugin "$plugin", "$@"/);
184 }
185 else {
f5f84847 186 push @plugins, $plugin;
502619e5 187 no strict 'refs';
188 push @{"$caller\::ISA"}, $plugin;
fc7ec1d9 189 }
190 }
191 }
d2d570d4 192 my $t = Text::ASCIITable->new( { hide_HeadRow => 1, hide_HeadLine => 1 } );
0f7ecc53 193 $t->setCols('Class');
0822f9a4 194 $t->setColWidth( 'Class', 75, 1 );
55c388c1 195 $t->addRow( wrap( $_, 75 ) ) for @plugins;
0f7ecc53 196 $caller->log->debug( 'Loaded plugins', $t->draw )
937fcdd8 197 if ( @plugins && $caller->debug );
fc7ec1d9 198
199 # Engine
200 $engine = "Catalyst::Engine::$ENV{CATALYST_ENGINE}"
201 if $ENV{CATALYST_ENGINE};
d96e14c2 202
fc7ec1d9 203 $engine->require;
204 die qq/Couldn't load engine "$engine", "$@"/ if $@;
502619e5 205 {
206 no strict 'refs';
970cc51d 207 push @{"$caller\::ISA"}, $engine;
502619e5 208 }
70cb38f0 209 $caller->engine($engine);
fc7ec1d9 210 $caller->log->debug(qq/Loaded engine "$engine"/) if $caller->debug;
424b2705 211
212 # Dispatcher
213 $dispatcher = "Catalyst::Dispatcher::$ENV{CATALYST_DISPATCHER}"
214 if $ENV{CATALYST_DISPATCHER};
215
216 $dispatcher->require;
217 die qq/Couldn't load dispatcher "$dispatcher", "$@"/ if $@;
218 {
219 no strict 'refs';
220 push @{"$caller\::ISA"}, $dispatcher;
221 }
222 $caller->dispatcher($dispatcher);
223 $caller->log->debug(qq/Loaded dispatcher "$dispatcher"/) if $caller->debug;
224
fc7ec1d9 225}
226
70cb38f0 227=item $c->engine
228
229Contains the engine class.
230
145074c2 231=item $c->log
232
233Contains the logging object. Unless it is already set Catalyst sets this up with a
234C<Catalyst::Log> object. To use your own log class:
235
236 $c->log( MyLogger->new );
237 $c->log->info("now logging with my own logger!");
238
239Your log class should implement the methods described in the C<Catalyst::Log>
240man page.
241
242
23f9d934 243=back
244
3cb1db8c 245=head1 SUPPORT
246
247IRC:
248
249 Join #catalyst on irc.perl.org.
250
251Mailing-Lists:
252
253 http://lists.rawmode.org/mailman/listinfo/catalyst
254 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
1985c30b 255
fc7ec1d9 256=head1 SEE ALSO
257
61b1e958 258=over 4
259
260=item L<Catalyst::Manual> - The Catalyst Manual
261
262=item L<Catalyst::Engine> - Core Engine
263
264=item L<Catalyst::Log> - The Log Class.
265
266=item L<Catalyst::Request> - The Request Object
267
268=item L<Catalyst::Response> - The Response Object
269
270=item L<Catalyst::Test> - The test suite.
271
272=back
fc7ec1d9 273
274=head1 AUTHOR
275
276Sebastian Riedel, C<sri@oook.de>
277
278=head1 THANK YOU
279
bc024080 280Andrew Ford, Andrew Ruthven, Christian Hansen, Christopher Hicks,
b0b7c5e0 281Dan Sully, Danijel Milicevic, David Naughton, Gary Ashton Jones,
282Jesse Sheidlower, Johan Lindstrom, Marcus Ramberg, Tatsuhiko Miyagawa
283and all the others who've helped.
fc7ec1d9 284
285=head1 LICENSE
286
287This library is free software . You can redistribute it and/or modify it under
288the same terms as perl itself.
289
290=cut
291
2921;