glossary updates
[catagits/Reaction.git] / lib / Reaction / Manual / Overview.pod
CommitLineData
63bb30b4 1=head1 NAME
2
3Reaction::Manual::Overview - Orientation in Reaction
4
5=head1 DESCRIPTION
6
7This document aims at describing the modular parts of L<Reaction> and explain
8how they are tied together.
9
ebc3b5e2 10=head1 WHAT IS REACTION
11
12Reaction is a L<Catalyst> extension providing you with:
13
14=over 4
15
16=item *
17
18Model mutations abstracted into Action objects.
19
20=item *
21
22Reflection to generate interface models using the Action objects from a L<DBIx::Class>
23schema.
24
25=item *
26
27An abstract UI expression system based on L<view|Reaction::UI::View::TT>,
28L<skin|Reaction::UI::Skin>, L<rendering context|Reaction::UI::RenderingContext>,
29L<widget|Reaction::UI::Widget> and L<layout set|Reaction::UI::LayoutSet>.
30
31=item *
32
33Stylable via skins. Parts of the skins can be extended and flexibly from large
34down to very small parts.
35
36=item *
37
38Full separation of interface rendering structure and templating, making re-usable
39extensions even easier.
40
41=back
42
63bb30b4 43=head1 APPLICATION
44
45A Reaction application is really a L<Catalyst> application under the hood. Reaction
46uses reflection to build more flexible and re-usable Catalyst components.
47
48The main application module (usually called C<MyApp> or C<MyApp.pm> in documentation)
49looks exactly like a typical Catalyst application module. Reaction's modular architecture
50allows it therefor to be integrated into other Catalyst applications, or to integrate
51other Catalyst extensions and components itself.
52
53=head1 CONTROLLERS
54
55Usually in Catalyst applications the controller's actions will take their arguments,
56maybe modify them or clean them up. After that they are processed by the model and then
57stashed away to be later used by the view.
58
59Reactions approach is a bit different. The cleanup and validation of values, and the
60involvement of the model are abstracted into a L<Reaction::InterfaceModel::Action>
61subclass. Examples for such actions would be C<Create>, C<Update> or C<Delete> in a
62CRUD situation.
63
64Controllers that use Reaction have to inherit from L<Reaction::UI::Controller> or a
65subclass of it. Some other useful controller base classes are:
66
67=over
68
69=item *
70
71L<Reaction::UI::Controller::Root> should be the base for the root controller to
72every chain of Reaction actions. It will provide a C<base> action you can chain
73to which will make sure the L<window viewport|/VIEWPORTS> and
74L<focus stack|/FOCUS STACK> are set up.
75
76=item *
77
78L<Reaction::UI::Controller::Collection> to ease the creation of components that act
79on collections as their model (database results for example). It provides actions
80to list and view the collection items.
81
82=item *
83
84L<Reaction::UI::Controller::Collection::CRUD> is a subclass of the above and provides
85additional C<create>, C<update>, C<delete> and C<delete_all> actions.
86
87=back
88
89=head1 VIEWPORTS
90
91Viewports represent the components that render your page when combined.
92
93The C<begin> action in L<Reaction::Controller::Root> creates a new L<Reaction::UI::Window>
94object and stores it as C<window> in the stash. The L<focus stack|/FOCUSSTACKS> of that
95window object is used as the base focus stack for the request.
96
97You can add a new inner viewport to the focus stack with the C<push_viewport> method
98available on your controller:
99
100 $controller->push_viewport($viewport_class, %viewport_args);
101
102This will add a new instance of C<$viewport_class> to the current focus stack using
103C<%viewport_args> as arguments. For more information on the usage and other options
104(for example the C<next_action> option, which redirects afterwards) see
105L<Reaction::UI::FocusStack> and L<Reaction::UI::ViewPort>.
106
107You can use the L<Reaction::UI::ViewPort::Action> viewport to build viewports
108that perform typical form actions like OK, Apply and Close.
109
110=head1 FOCUSSTACKS
111
112Viewports are pushed onto the current focus stack. The C<end> action in
113L<Reaction::Controller::Root> will C<flush> the L<Reaction::UI::Window>
114object stored as C<window> in the stash.
115
116=head1 DOMAIN MODELS
117
118The domain models should be completely decoupled from the application and it's business
119logic. Normally, you need to decide whether to put your business logic in your controller
120or in your model. Reaction solves this problem by using L<interface models|/INTERFACE MODELS>
121as a separation between the two.
122
123If you want your domain model to be reflectable (L<DBIx::Class> for example) you will have
124to use L<Moose> to add attribute metadata to those classes.
125
126=head1 INTERFACE MODELS
127
128The interface models contain your business logic. That is, the application specific logic
129representing the model your application will use.
130
131An interface model consists of action classes subclassing L<Reaction::InterfaceModel::Action>.
132These instances will have both the request context and the target model available and can do
133their work in a C<do_apply> method.
134
135To allow your own models to be tied in to reflective controllers like
136L<Reaction::Controller::Collection>, you can subclass L<Reaction::InterfaceModel::Object>.
137That will provide you with a way to let the viewports introspect the actions that your
138interface model defines for this model.
139
140An example of this would be:
141
142 - MyApp::Controller::Foo is a Reaction::Controller::Collection::CRUD
143 for MyApp::Model::Foo
144 - The model_name config setting is 'Model::Foo'
145 - User calls action MyApp::Controller::Foo->delete_old
146 - The 'delete_old' controller action will call
147 $self->basic_model_action($c, \%vp_args)
148 - The 'target' option in %vp_args will be asked for an action that
149 corresponds with the 'delete_old' controller action
150 - An instance of MyApp::Model::Foo::Action::DeleteOld is
151 returned
152 - This is passed as 'model' to a new instance of
153 Reaction::UI::ViewPort::Action which is then pushed
154 onto the focus stack.
155
156Form processing as provided by L<Reaction::UI::ViewPort::Action> is a very good
157example of Reaction's usefulness; Instead of creating a new dialog for every
158form using myriads of helper functions, you provide a controller baseclass
159rendering the dialog by introspecting an interface model object with fields and
160actions.
161
162Then you just need to create a new controller and interface model for your new
163dialog and it just works.
164
165If your model is a L<DBIx::Class::Schema> and contains L<Moose> metadata, you
166can let L<Reaction::InterfaceModel::Reflector::DBIC> set up your interface
167model objects and actions.
168
169=head1 SKINS, LAYOUTS AND WIDGETS
170
171When you push a viewport onto the focus stack like this:
172
173 $controller->push_viewport('Reaction::UI::ViewPort::SiteLayout');
174
175Reaction will look for a layout file named
176C<$search_path/skin/$skin_name/layout/site_layout.tt>. If it can't find it,
177it will also look in the base skin and search paths.
178
179You can also provide a specific layout:
180
181 $controller->push_viewport(
182 'Reaction::UI::ViewPort::SiteLayout',
183 layout => 'my_site_layout',
184 );
185
186A new instance of L<Reaction::UI::LayoutSet> will be created using the layout
187file. It is then used to determine the class of widget to create. The widget
188contains the Perl code counterpart of the templating part in the layout file.
189
190The widget is either determined by the C<=widget> template directive in the
191layout file or by the L<Reaction::UI::Skin> object created to represent the
192skin.
193
194The details of skins or layouts are documented in L<Reaction::Manual::Templates>.
195
196=head1 SEE ALSO
197
198=over
199
200=item * L<Reaction::Manual>
201
202=item * L<Reaction::Manual::Intro>
203
204=back
205
206=head1 AUTHORS
207
208See L<Reaction::Class> for authors.
209
210=head1 LICENSE
211
212See L<Reaction::Class> for the license.
213
214=cut