complete overhaul, now with documentation
[catagits/CatalystX-Declare.git] / lib / CatalystX / Declare.pm
CommitLineData
9c11a562 1use MooseX::Declare;
2
856ac9a7 3class CatalystX::Declare extends MooseX::Declare is dirty {
9c11a562 4
856ac9a7 5 use aliased 'CatalystX::Declare::Keyword::Controller', 'ControllerKeyword';
6 use aliased 'CatalystX::Declare::Keyword::Role', 'RoleKeyword';
7 use aliased 'CatalystX::Declare::Keyword::Application', 'ApplicationKeyword';
8
9 clean;
10
11 our $VERSION = '0.001';
9c11a562 12
13 around keywords {
14 $self->$orig,
15 ControllerKeyword->new(identifier => 'controller'),
856ac9a7 16 RoleKeyword->new(identifier => 'controller_role'),
17 ApplicationKeyword->new(identifier => 'application'),
9c11a562 18 }
19}
20
856ac9a7 21__END__
22
23=head1 NAME
24
25CatalystX::Declare - EXPERIMENTAL Declarative Syntax for Catalyst Applications
26
27=head1 SYNOPSIS
28
29=head2 Application
30
31 use CatalystX::Declare;
32
33 application MyApp::Web with Static::Simple {
34
35 $CLASS->config(name => 'My Declarative Web Application');
36 }
37
38=head2 Controllers
39
40 use CatalystX::Declare;
41
42 controller MyApp::Web::Controller::Foo
43 with MyApp::Web::ControllerRole::Bar {
44
45 use MooseX::Types::Moose qw( Str );
46
47
48 has welcome_message => (
49 is => 'rw',
50 isa => Str,
51 required => 1,
52 lazy_build => 1,
53 );
54
55 method _build_welcome_message { 'Welcome' }
56
57
58 action base as '';
59
60 under base {
61
62 final action welcome {
63 $ctx->response->body( $self->welcome_message );
64 }
65 }
66 }
67
68=head2 Roles
69
70 use CatalystX::Declare;
71
72 controller_role MyApp::Web::ControllerRole::Bar {
73
74 use MyApp::Types qw( Username );
75
76
77 around _build_welcome_message { $self->$orig . '!' }
78
79 after welcome (Object $ctx) {
80
81 $ctx->response->body(join "\n",
82 $ctx->response->body,
83 time(),
84 );
85 }
86
87
88 final action special_welcome (Username $name) under base {
89
90 $ctx->response->body('Hugs to ' . $name);
91 }
92 }
93
94=head1 DESCRIPTION
95
96This module provides a declarative syntax for L<Catalyst|Catalyst::Runtime>
97applications. Its main focus is currently on common and repetitious parts of
98the application, such as the application class itself, controllers, and
99controller roles.
100
101=head2 Not a Source Filter
102
103The used syntax elements are not parsed via source filter mechanism, but
104through L<Devel::Declare>, which is a much less fragile deal to handle and
105allows extensions to mix without problems. For example, all keywords added
106by this module are separete handlers.
107
108=head2 Syntax Documentation
109
110The documentation about syntax is in the respective parts of the distribution
111below the C<CatalystX::Declare::Keyword::> namespace. Here are the manual
112pages you will be interested in to familiarize yourself with this module's
113syntax extensions:
114
115=over
116
117=item L<CatalystX::Declare::Keyword::Application>
118
119=item L<CatalystX::Declare::Keyword::Controller>
120
121=item L<CatalystX::Declare::Keyword::Action>
122
123=item L<CatalystX::Declare::Keyword::Role>
124
125=back
126
127Things like models, views, roles for request or response objects, can be built
128declaratively with L<MooseX::Declare>, which is used to additionally provide
129keywords for C<class>, C<role>, C<method> and the available method modifier
130declarations. This allows for constructs such as:
131
132 use CatalystX::Declare;
133
134 class Foo {
135
136 method bar { 23 }
137 }
138
139 controller MyApp::Web::Controller::Baz {
140
141 final action qux {
142 $ctx->response->body(Foo->new->bar)
143 }
144 }
145
146=head1 SEE ALSO
147
148=head2 For Usage Information
149
150These links are intended for the common user of this module.
151
152=over
153
154=item L<Catalyst::Runtime>
155
156=item L<Catalyst::Devel>
157
158=item L<Catalyst::Manual>
159
160Although you probably already know Catalyst, since you otherwise probably
161wouldn't be here, I include these links for completeness sake.
162
163=item L<Moose>
164
165The powerful modern Perl object orientation implementation that is used
166as basis for Catalyst. L<MooseX::Declare>, on which L<CatalystX::Declare>
167is based, provides a declarative syntax for L<Moose>.
168
169=item L<MooseX::Declare>
170
171We inherit almost all functionality from L<MooseX::Declare> to allow the
172declaration of traditional classes, roles, methods, modifiers, etc. Refer
173to this documentation first for syntax elements that aren't part of
174L<CatalystX::Declare>.
175
176=item L<MooseX::Method::Signatures>
177
178This isn't directly used, but L<MooseX::Declare> utilises this to provide
179us with method and modifier declarations. For extended information on the
180usage of methods, especially signatures, refer to this module after
181looking for an answer in the L<MooseX::Declare> documentation.
182
183=back
184
185=head2 For Developer Information
186
187This section contains links relevant to the implementation of this module.
188
189=over
190
191=item L<Devel::Declare>
192
193You could call this is the basic machine room that runs the interaction with
194perl. It provides a way to hook into perl's source code parsing and change
195small parts on a per-statement basis.
196
197=item L<MooseX::MethodAttributes>
198
199We use this module to easily communicate the action attributes to
200L<Catalyst|Catalyst::Runtime>. Currently, this is the easiest solution for
201now but may be subject to change in the future.
202
203=back
204
205
206=head1 AUTHOR
207
208=over
209
210=item Robert 'phaylon' Sedlacek, L<E<lt>rs@474.atE<gt>>
211
212=back
213
214With contributions from, and many thanks to:
215
216=over
217
218=item Florian Ragwitz
219
220=item John Napiorkowski
221
222=back
223
224
225=head1 LICENSE
226
227This program is free software; you can redistribute it and/or modify it under
228the same terms as perl itself.
229
230=cut