4 use base 'Catalyst::Base';
5 use UNIVERSAL::require;
10 our $CATALYST_SCRIPT_GEN = 4;
12 __PACKAGE__->mk_classdata($_) for qw/dispatcher engine log/;
14 our $VERSION = '5.20';
19 Catalyst - The Elegant MVC Web Application Framework
23 # use the helper to start a new application
27 # add models, views, controllers
28 script/create.pl model Something
29 script/create.pl view Stuff
30 script/create.pl controller Yada
35 # command line interface
41 use Catalyst qw/My::Module My::OtherModule/;
43 use Catalyst '-Debug';
45 use Catalyst qw/-Debug -Engine=CGI/;
47 sub default : Private { $_[1]->res->output('Hello') } );
49 sub index : Path('/index.html') {
50 my ( $self, $c ) = @_;
51 $c->res->output('Hello');
55 sub product : Regex('^product[_]*(\d*).html$') {
56 my ( $self, $c ) = @_;
57 $c->stash->{template} = 'product.tt';
58 $c->stash->{product} = $c->req->snippets->[0];
61 See also L<Catalyst::Manual::Intro>
65 Catalyst is based upon L<Maypole>, which you should consider for smaller
68 The key concept of Catalyst is DRY (Don't Repeat Yourself).
70 See L<Catalyst::Manual> for more documentation.
72 Catalyst plugins can be loaded by naming them as arguments to the "use Catalyst" statement.
73 Omit the C<Catalyst::Plugin::> prefix from the plugin name,
74 so C<Catalyst::Plugin::My::Module> becomes C<My::Module>.
76 use Catalyst 'My::Module';
78 Special flags like -Debug and -Engine can also be specifed as arguments when
81 use Catalyst qw/-Debug My::Module/;
83 The position of plugins and flags in the chain is important, because they are
84 loaded in exactly the order that they appear.
86 The following flags are supported:
92 enables debug output, i.e.:
94 use Catalyst '-Debug';
96 this is equivalent to:
103 Force Catalyst to use a specific engine.
104 Omit the C<Catalyst::Engine::> prefix of the engine name, i.e.:
106 use Catalyst '-Engine=CGI';
116 Overload to enable debug messages.
124 Returns a hashref containing your applications settings.
129 my ( $self, @options ) = @_;
130 my $caller = caller(0);
132 # Prepare inheritance
133 unless ( $caller->isa($self) ) {
135 push @{"$caller\::ISA"}, $self;
138 if ( $caller->engine ) {
139 return; # Catalyst is already initialized
142 unless ( $caller->log ) {
143 $caller->log( Catalyst::Log->new );
147 if ( $ENV{CATALYST_DEBUG} || $ENV{ uc($caller) . '_DEBUG' } ) {
149 *{"$caller\::debug"} = sub { 1 };
150 $caller->log->debug('Debug messages enabled');
153 my $engine = 'Catalyst::Engine::CGI';
154 my $dispatcher = 'Catalyst::Dispatcher';
156 if ( $ENV{MOD_PERL} ) {
160 if ( $mod_perl::VERSION >= 1.99_90_22 ) {
161 $engine = 'Catalyst::Engine::Apache::MP20';
164 elsif ( $mod_perl::VERSION >= 1.99_01 ) {
165 $engine = 'Catalyst::Engine::Apache::MP19';
168 elsif ( $mod_perl::VERSION >= 1.27 ) {
169 $engine = 'Catalyst::Engine::Apache::MP13';
173 die( qq/Unsupported mod_perl version: "$mod_perl::VERSION"/ );
177 $caller->log->info( "You are running an old helper script! "
178 . "Please update your scripts by regenerating the "
179 . "application and copying over the new scripts." )
180 if ( $ENV{CATALYST_SCRIPT_GEN}
181 && ( $ENV{CATALYST_SCRIPT_GEN} < $CATALYST_SCRIPT_GEN ) );
188 next if $caller->debug;
190 *{"$caller\::debug"} = sub { 1 };
191 $caller->log->debug('Debug messages enabled');
194 elsif (/^-Dispatcher=(.*)$/) {
195 $dispatcher = "Catalyst::Dispatcher::$1";
198 elsif (/^-Engine=(.*)$/) { $engine = "Catalyst::Engine::$1" }
199 elsif (/^-.*$/) { $caller->log->error(qq/Unknown flag "$_"/) }
202 my $plugin = "Catalyst::Plugin::$_";
206 if ($@) { die qq/Couldn't load plugin "$plugin", "$@"/ }
208 push @plugins, $plugin;
210 push @{"$caller\::ISA"}, $plugin;
217 my $t = Text::ASCIITable->new( { hide_HeadRow => 1, hide_HeadLine => 1 } );
218 $t->setCols('Class');
219 $t->setColWidth( 'Class', 75, 1 );
220 $t->addRow($_) for @plugins;
221 $caller->log->debug( 'Loaded plugins', $t->draw )
222 if ( @plugins && $caller->debug );
225 $dispatcher = "Catalyst::Dispatcher::$ENV{CATALYST_DISPATCHER}"
226 if $ENV{CATALYST_DISPATCHER};
227 my $appdis = $ENV{ uc($caller) . '_DISPATCHER' };
228 $dispatcher = "Catalyst::Dispatcher::$appdis" if $appdis;
230 $dispatcher->require;
231 die qq/Couldn't load dispatcher "$dispatcher", "$@"/ if $@;
234 push @{"$caller\::ISA"}, $dispatcher;
236 $caller->dispatcher($dispatcher);
237 $caller->log->debug(qq/Loaded dispatcher "$dispatcher"/) if $caller->debug;
240 $engine = "Catalyst::Engine::$ENV{CATALYST_ENGINE}"
241 if $ENV{CATALYST_ENGINE};
242 my $appeng = $ENV{ uc($caller) . '_ENGINE' };
243 $engine = "Catalyst::Engine::$appeng" if $appeng;
246 die qq/Couldn't load engine "$engine", "$@"/ if $@;
250 push @{"$caller\::ISA"}, $engine;
253 $caller->engine($engine);
254 $caller->log->debug(qq/Loaded engine "$engine"/) if $caller->debug;
257 my $home = Catalyst::Utils::home($caller);
258 if ( $caller->debug ) {
261 ? $caller->log->debug(qq/Found home "$home"/)
262 : $caller->log->debug(qq/Home "$home" doesn't exist/)
263 : $caller->log->debug(q/Couldn't find home/);
265 $caller->config->{home} = $home || '';
266 $caller->config->{root} = defined $home ? dir($home)->subdir('root') : '';
271 Contains the engine class.
275 Contains the logging object. Unless it is already set Catalyst sets this up with a
276 C<Catalyst::Log> object. To use your own log class:
278 $c->log( MyLogger->new );
279 $c->log->info("now logging with my own logger!");
281 Your log class should implement the methods described in the C<Catalyst::Log>
284 =item $c->plugin( $name, $class, @args )
286 Instant plugins for Catalyst.
287 Classdata accessor/mutator will be created, class loaded and instantiated.
289 MyApp->plugin( 'prototype', 'HTML::Prototype' );
291 $c->prototype->define_javascript_functions;
296 my ( $class, $name, $plugin, @args ) = @_;
298 my $error = $UNIVERSAL::require::ERROR;
299 die qq/Couldn't load instant plugin "$plugin", "$error"/ if $error;
300 eval { $plugin->import };
301 $class->mk_classdata($name);
303 eval { $obj = $plugin->new(@args) };
304 die qq/Couldn't instantiate instant plugin "$plugin", "$@"/ if $@;
306 $class->log->debug(qq/Initialized instant plugin "$plugin" as "$name"/)
314 mod_perl2 support is considered experimental and may contain bugs.
320 Join #catalyst on irc.perl.org.
324 http://lists.rawmode.org/mailman/listinfo/catalyst
325 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
329 http://catalyst.perl.org
335 =item L<Catalyst::Manual> - The Catalyst Manual
337 =item L<Catalyst::Engine> - Core Engine
339 =item L<Catalyst::Log> - The Log Class.
341 =item L<Catalyst::Request> - The Request Object
343 =item L<Catalyst::Response> - The Response Object
345 =item L<Catalyst::Test> - The test suite.
351 Sebastian Riedel, C<sri@oook.de>
355 Andy Grundman, Andrew Ford, Andrew Ruthven, Autrijus Tang, Christian Hansen,
356 Christopher Hicks, Dan Sully, Danijel Milicevic, David Naughton,
357 Gary Ashton Jones, Geoff Richards, Jesse Sheidlower, Jody Belka,
358 Johan Lindstrom, Leon Brocard, Marcus Ramberg, Tatsuhiko Miyagawa
359 and all the others who've helped.
363 This library is free software . You can redistribute it and/or modify it under
364 the same terms as perl itself.