fix import inheritance bug.
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
CommitLineData
fc7ec1d9 1package Catalyst;
2
3use strict;
5d9a6d47 4use base qw[ Catalyst::Base Catalyst::Setup ];
fc7ec1d9 5use UNIVERSAL::require;
a2f2cde9 6use Catalyst::Exception;
fc7ec1d9 7use Catalyst::Log;
812a28c9 8use Catalyst::Utils;
5d9a6d47 9use NEXT;
0f7ecc53 10use Text::ASCIITable;
4f6748f1 11use Path::Class;
367d15f8 12our $CATALYST_SCRIPT_GEN = 4;
fc7ec1d9 13
10dd6896 14__PACKAGE__->mk_classdata($_) for qw/arguments dispatcher engine log/;
15
abddf0b5 16our $VERSION = '5.24';
fc7ec1d9 17our @ISA;
18
19=head1 NAME
20
21Catalyst - The Elegant MVC Web Application Framework
22
23=head1 SYNOPSIS
24
25 # use the helper to start a new application
91864987 26 catalyst.pl MyApp
fc7ec1d9 27 cd MyApp
28
29 # add models, views, controllers
ae4e40a7 30 script/myapp_create.pl model Something
31 script/myapp_create.pl view Stuff
32 script/myapp_create.pl controller Yada
fc7ec1d9 33
34 # built in testserver
ae4e40a7 35 script/myapp_server.pl
fc7ec1d9 36
37 # command line interface
ae4e40a7 38 script/myapp_test.pl /yada
fc7ec1d9 39
40
fc7ec1d9 41 use Catalyst;
42
43 use Catalyst qw/My::Module My::OtherModule/;
44
45 use Catalyst '-Debug';
46
47 use Catalyst qw/-Debug -Engine=CGI/;
48
5a8ed4fe 49 sub default : Private { $_[1]->res->output('Hello') } );
50
e3dc9d78 51 sub index : Path('/index.html') {
5a8ed4fe 52 my ( $self, $c ) = @_;
53 $c->res->output('Hello');
064834ea 54 $c->forward('foo');
5a8ed4fe 55 }
56
064834ea 57 sub product : Regex('^product[_]*(\d*).html$') {
5a8ed4fe 58 my ( $self, $c ) = @_;
59 $c->stash->{template} = 'product.tt';
60 $c->stash->{product} = $c->req->snippets->[0];
61 }
fc7ec1d9 62
3803e98f 63See also L<Catalyst::Manual::Intro>
64
fc7ec1d9 65=head1 DESCRIPTION
66
fc7ec1d9 67The key concept of Catalyst is DRY (Don't Repeat Yourself).
68
69See L<Catalyst::Manual> for more documentation.
70
23f9d934 71Catalyst plugins can be loaded by naming them as arguments to the "use Catalyst" statement.
1985c30b 72Omit the C<Catalyst::Plugin::> prefix from the plugin name,
23f9d934 73so C<Catalyst::Plugin::My::Module> becomes C<My::Module>.
fc7ec1d9 74
75 use Catalyst 'My::Module';
76
23f9d934 77Special flags like -Debug and -Engine can also be specifed as arguments when
78Catalyst is loaded:
fc7ec1d9 79
80 use Catalyst qw/-Debug My::Module/;
81
23f9d934 82The position of plugins and flags in the chain is important, because they are
83loaded in exactly the order that they appear.
fc7ec1d9 84
23f9d934 85The following flags are supported:
86
87=over 4
88
89=item -Debug
90
91enables debug output, i.e.:
fc7ec1d9 92
93 use Catalyst '-Debug';
94
23f9d934 95this is equivalent to:
fc7ec1d9 96
97 use Catalyst;
98 sub debug { 1 }
99
23f9d934 100=item -Engine
fc7ec1d9 101
102Force Catalyst to use a specific engine.
23f9d934 103Omit the C<Catalyst::Engine::> prefix of the engine name, i.e.:
fc7ec1d9 104
105 use Catalyst '-Engine=CGI';
106
23f9d934 107=back
fc7ec1d9 108
23f9d934 109=head1 METHODS
110
111=over 4
112
113=item debug
fc7ec1d9 114
115Overload to enable debug messages.
116
117=cut
118
119sub debug { 0 }
120
23f9d934 121=item config
fc7ec1d9 122
123Returns a hashref containing your applications settings.
124
125=cut
126
fc7ec1d9 127sub import {
0319a12c 128 my ( $class, @arguments ) = @_;
10dd6896 129
599b5295 130 return unless $class eq 'Catalyst';
131
fc7ec1d9 132 my $caller = caller(0);
38cb5be3 133
99fe1710 134 # Prepare inheritance
0319a12c 135 unless ( $caller->isa($class) ) {
10dd6896 136
fc7ec1d9 137 no strict 'refs';
0319a12c 138 push @{"$caller\::ISA"}, $class;
10dd6896 139
1c99e125 140 }
0319a12c 141
10dd6896 142 $caller->arguments( [ @arguments ] );
143 $caller->setup_home;
0319a12c 144}
145
146=item $c->engine
147
148Contains the engine class.
fc7ec1d9 149
0319a12c 150=item $c->log
151
152Contains the logging object. Unless it is already set Catalyst sets this up with a
153C<Catalyst::Log> object. To use your own log class:
154
155 $c->log( MyLogger->new );
156 $c->log->info("now logging with my own logger!");
157
158Your log class should implement the methods described in the C<Catalyst::Log>
159man page.
160
161=item $c->plugin( $name, $class, @args )
162
163Instant plugins for Catalyst.
164Classdata accessor/mutator will be created, class loaded and instantiated.
165
166 MyApp->plugin( 'prototype', 'HTML::Prototype' );
167
168 $c->prototype->define_javascript_functions;
169
170=cut
171
172sub plugin {
173 my ( $class, $name, $plugin, @args ) = @_;
174 $plugin->require;
175
176 if ( my $error = $UNIVERSAL::require::ERROR ) {
177 Catalyst::Exception->throw(
178 message => qq/Couldn't load instant plugin "$plugin", "$error"/
179 );
180 }
181
182 eval { $plugin->import };
183 $class->mk_classdata($name);
184 my $obj;
185 eval { $obj = $plugin->new(@args) };
186
187 if ( $@ ) {
188 Catalyst::Exception->throw(
189 message => qq/Couldn't instantiate instant plugin "$plugin", "$@"/
190 );
191 }
192
193 $class->$name($obj);
194 $class->log->debug(qq/Initialized instant plugin "$plugin" as "$name"/)
195 if $class->debug;
196}
197
23f9d934 198=back
199
d2ee9760 200=head1 CASE SENSITIVITY
201
202By default Catalyst is not case sensitive, so C<MyApp::C::FOO::Bar> becomes
203C</foo/bar>.
204
205But you can activate case sensitivity with a config parameter.
206
207 MyApp->config->{case_sensitive} = 1;
208
d1a31ac6 209=head1 LIMITATIONS
210
b2b7d352 211mod_perl2 support is considered experimental and may contain bugs.
d1a31ac6 212
3cb1db8c 213=head1 SUPPORT
214
215IRC:
216
217 Join #catalyst on irc.perl.org.
218
219Mailing-Lists:
220
221 http://lists.rawmode.org/mailman/listinfo/catalyst
222 http://lists.rawmode.org/mailman/listinfo/catalyst-dev
1985c30b 223
432d507d 224Web:
225
226 http://catalyst.perl.org
227
fc7ec1d9 228=head1 SEE ALSO
229
61b1e958 230=over 4
231
232=item L<Catalyst::Manual> - The Catalyst Manual
233
234=item L<Catalyst::Engine> - Core Engine
235
236=item L<Catalyst::Log> - The Log Class.
237
238=item L<Catalyst::Request> - The Request Object
239
240=item L<Catalyst::Response> - The Response Object
241
242=item L<Catalyst::Test> - The test suite.
243
244=back
fc7ec1d9 245
246=head1 AUTHOR
247
248Sebastian Riedel, C<sri@oook.de>
249
250=head1 THANK YOU
251
84cf74e7 252Andy Grundman, Andrew Ford, Andrew Ruthven, Autrijus Tang, Christian Hansen,
ce2b098c 253Christopher Hicks, Dan Sully, Danijel Milicevic, David Naughton,
75aeff23 254Gary Ashton Jones, Geoff Richards, Jesse Sheidlower, Jody Belka,
9cee9588 255Johan Lindstrom, Juan Camacho, Leon Brocard, Marcus Ramberg,
256Tatsuhiko Miyagawa and all the others who've helped.
fc7ec1d9 257
258=head1 LICENSE
259
260This library is free software . You can redistribute it and/or modify it under
261the same terms as perl itself.
262
263=cut
264
2651;