whole new syntax
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
1 package Catalyst;
2
3 use strict;
4 use base 'Catalyst::Base';
5 use UNIVERSAL::require;
6 use Catalyst::Log;
7
8 __PACKAGE__->mk_classdata($_) for qw/engine log/;
9
10 our $VERSION = '5.00';
11 our @ISA;
12
13 =head1 NAME
14
15 Catalyst - The Elegant MVC Web Application Framework
16
17 =head1 SYNOPSIS
18
19     # use the helper to start a new application
20     catalyst.pl MyApp
21     cd MyApp
22
23     # add models, views, controllers
24     script/create.pl model Something
25     script/create.pl view Stuff
26     script/create.pl controller Yada
27
28     # built in testserver
29     script/server.pl
30
31     # command line interface
32     script/test.pl /yada
33
34
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
61 See also L<Catalyst::Manual::Intro>
62
63 =head1 DESCRIPTION
64
65 Catalyst is based upon L<Maypole>, which you should consider for smaller
66 projects.
67
68 The key concept of Catalyst is DRY (Don't Repeat Yourself).
69
70 See L<Catalyst::Manual> for more documentation.
71
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>.
75
76     use Catalyst 'My::Module';
77
78 Special flags like -Debug and -Engine can also be specifed as arguments when
79 Catalyst is loaded:
80
81     use Catalyst qw/-Debug My::Module/;
82
83 The position of plugins and flags in the chain is important, because they are
84 loaded in exactly the order that they appear.
85
86 The following flags are supported:
87
88 =over 4
89
90 =item -Debug
91
92 enables debug output, i.e.:
93
94     use Catalyst '-Debug';
95
96 this is equivalent to:
97
98     use Catalyst;
99     sub debug { 1 }
100
101 =item -Engine
102
103 Force Catalyst to use a specific engine.
104 Omit the C<Catalyst::Engine::> prefix of the engine name, i.e.:
105
106     use Catalyst '-Engine=CGI';
107
108 =back
109
110 =head1 METHODS
111
112 =over 4
113
114 =item debug
115
116 Overload to enable debug messages.
117
118 =cut
119
120 sub debug { 0 }
121
122 =item config
123
124 Returns a hashref containing your applications settings.
125
126 =cut
127
128 sub import {
129     my ( $self, @options ) = @_;
130     my $caller = caller(0);
131
132     unless ( $caller->isa($self) ) {
133         no strict 'refs';
134         push @{"$caller\::ISA"}, $self;
135     }
136
137     if ( $caller->engine ) {
138         return;    # Catalyst is allready initialized
139     }
140
141     unless ( $caller->log ) {
142         $caller->log( Catalyst::Log->new );
143     }
144
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
151     # Options
152     my $engine =
153       $ENV{MOD_PERL}
154       ? 'Catalyst::Engine::Apache'
155       : 'Catalyst::Engine::CGI';
156
157     foreach (@options) {
158         if (/^\-Debug$/) {
159             next if $caller->debug;
160             no strict 'refs';
161             *{"$caller\::debug"} = sub { 1 };
162             $caller->log->debug('Debug messages enabled');
163         }
164         elsif (/^-Engine=(.*)$/) { $engine = "Catalyst::Engine::$1" }
165         elsif (/^-.*$/) { $caller->log->error(qq/Unknown flag "$_"/) }
166         else {
167             my $plugin = "Catalyst::Plugin::$_";
168
169             # Plugin caller should be our application class
170             eval "package $caller; require $plugin";
171             if ($@) {
172                 $caller->log->error(qq/Couldn't load plugin "$plugin", "$@"/);
173             }
174             else {
175                 $caller->log->debug(qq/Loaded plugin "$plugin"/)
176                   if $caller->debug;
177                 no strict 'refs';
178                 push @{"$caller\::ISA"}, $plugin;
179             }
180         }
181     }
182
183     # Engine
184     $engine = "Catalyst::Engine::$ENV{CATALYST_ENGINE}"
185       if $ENV{CATALYST_ENGINE};
186
187     if ( $engine eq 'Catalyst::Engine::Server' ) {
188         $engine = 'Catalyst::Engine::HTTP::Daemon';
189         $caller->log->warn( "Catalyst::Engine::Server is deprecated, "
190               . "using Catalyst::Engine::HTTP::Daemon." );
191     }
192
193     $engine->require;
194     die qq/Couldn't load engine "$engine", "$@"/ if $@;
195     {
196         no strict 'refs';
197         unshift @{"$caller\::ISA"}, $engine;
198     }
199     $caller->engine($engine);
200     $caller->log->debug(qq/Loaded engine "$engine"/) if $caller->debug;
201 }
202
203 =item $c->engine
204
205 Contains the engine class.
206
207 =item $c->log
208
209 Contains the logging object.  Unless it is already set Catalyst sets this up with a
210 C<Catalyst::Log> object.  To use your own log class:
211
212     $c->log( MyLogger->new );
213     $c->log->info("now logging with my own logger!");
214
215 Your log class should implement the methods described in the C<Catalyst::Log>
216 man page.
217
218
219 =back
220
221 =head1 SUPPORT
222
223 IRC:
224
225     Join #catalyst on irc.perl.org.
226
227 Mailing-Lists:
228
229     http://lists.rawmode.org/mailman/listinfo/catalyst
230     http://lists.rawmode.org/mailman/listinfo/catalyst-dev
231
232 =head1 SEE ALSO
233
234 L<Catalyst::Manual>, L<Catalyst::Test>, L<Catalyst::Request>,
235 L<Catalyst::Response>, L<Catalyst::Engine>
236
237 =head1 AUTHOR
238
239 Sebastian Riedel, C<sri@oook.de>
240
241 =head1 THANK YOU
242
243 Andrew Ford, Andrew Ruthven, Christian Hansen, Christopher Hicks,
244 Dan Sully, Danijel Milicevic, David Naughton, Gary Ashton Jones,
245 Jesse Sheidlower, Johan Lindstrom, Marcus Ramberg, Tatsuhiko Miyagawa
246 and all the others who've helped.
247
248 =head1 LICENSE
249
250 This library is free software . You can redistribute it and/or modify it under
251 the same terms as perl itself.
252
253 =cut
254
255 1;