3 Reaction::Manual::Internals
5 =head2 Hacking on Reaction
7 =head3 What is a component?
9 =head3 What component types are there?
11 =head3 How do I create a new component?
13 =head3 How does it work with a database?
15 =head3 What about Moose?
21 =head3 What Perl modules should I be familiar with, in order to hack on Reaction's
28 A complete modern object system for Perl 5.
32 Use shorter package names, i.e., "X::Y::Z" as "Z".
36 The MVC application framework Reaction uses.
40 =item * L<Catalyst::Controller::BindLex>
42 =item * L<Catalyst::Model::DBIC::Schema>
44 =item * L<Catalyst::Plugin::ConfigLoader>
46 =item * L<Catalyst::Plugin::I18N>
48 =item * L<Catalyst::Plugin::Static::Simple>
50 =item * L<Catalyst::View::TT>
58 =item L<Config::General>
60 Generic config file module.
64 Object/Relational mapper.
68 =item L<DateTime::Format::MySQL>
74 =item L<Email::MIME::Creator>
80 =item L<SQL::Translator>
84 =item L<Test::Memory::Cycle>
86 =item L<Time::ParseDate>
90 =head3 Packages involved
94 =item L<Reaction::Class>
96 Utility class, sets up to export a few methods that return parameters for use
97 within Moose's C<has> (as new parameters) in other packages. It also C<use>s
100 The methods it injects are:
104 =item set_or_lazy_build($field_name)
106 The attribute is required, if not provided beforehand the build_${name} method
107 will be called on the object when the attribute's getter is first called. If
108 the method does not exist, or returns undef, an error will be thrown.
110 =item set_or_lazy_fail()
112 The attribute is required, if not provided beforehand the 'lazy' parameter of
113 Moose will make it fail.
115 =item trigger_adopt()
117 Calls adopt_${type} after the attribute value is set to $type.
119 =item register_inc_entry()
121 Will mark the calling package as already included, using %INC.
125 =item Reaction::InterfaceModel::Action
127 =item Reaction::InterfaceModel::Action::DBIC::ResultSet::Create;
129 =item Reaction::InterfaceModel::Action::DBIC::ActionReflector;
131 A method "adaptor" that creates the needed objects to support CRUD DBIC
132 actions. In the future the code could be moved to a class higher in the
133 hierarchy and only contain the operations to adapt.
137 Reaction::InterfaceModel::Action::DBIC::ActionReflector->reflect_actions_for(
138 Reaction::InterfaceModel::Action::DBIC::ActionReflector=HASH(0x93cb2f0)
140 ComponentUI::Model::Action
143 Generates and evaluates:
145 package ComponentUI::Model::Action::DeleteFoo;
147 extends 'Reaction::InterfaceModel::Action::DBIC::Result::Delete';
148 package ComponentUI::Model::Action::UpdateFoo;
150 extends 'Reaction::InterfaceModel::Action::DBIC::Result::Update';
151 has 'baz_list' => (isa => 'ArrayRef', is => 'rw', set_or_lazy_fail('baz_list'), default => sub { [] }, valid_values => sub {
154 ->related_source('links_to_baz_list')
155 ->related_source('baz')
158 has 'last_name' => (isa => 'NonEmptySimpleStr', is => 'rw', set_or_lazy_fail('last_name'));
159 has 'first_name' => (isa => 'NonEmptySimpleStr', is => 'rw', set_or_lazy_fail('first_name'));
160 package ComponentUI::Model::Action::CreateFoo;
162 extends 'Reaction::InterfaceModel::Action::DBIC::ResultSet::Create';
163 has 'baz_list' => (isa => 'ArrayRef', is => 'rw', set_or_lazy_fail('baz_list'), default => sub { [] }, valid_values => sub {
166 ->related_source('links_to_baz_list')
167 ->related_source('baz')
170 has 'last_name' => (isa => 'NonEmptySimpleStr', is => 'rw', set_or_lazy_fail('last_name'));
171 has 'first_name' => (isa => 'NonEmptySimpleStr', is => 'rw', set_or_lazy_fail('first_name'));
173 =item Reaction::InterfaceModel::Action::DBIC::Result::Delete
175 =item Reaction::InterfaceModel::Action::DBIC::Result::Update
177 =item Reaction::InterfaceModel::Action::DBIC::User::ResetPassword
179 =item Reaction::InterfaceModel::Action::DBIC::User::Role::SetPassword
181 =item Reaction::InterfaceModel::Action::DBIC::User::ChangePassword
183 =item Reaction::InterfaceModel::Action::User::ResetPassword
185 =item Reaction::InterfaceModel::Action::User::ChangePassword
187 =item Reaction::InterfaceModel::Action::User::SetPassword
189 =item Reaction::Meta::InterfaceModel::Action::ParameterAttribute
191 =item Reaction::Meta::InterfaceModel::Action::Class
193 =item Reaction::Types::Email
195 =item Reaction::Types::Core
197 =item Reaction::Types::DateTime
199 =item Reaction::Types::File
201 =item Reaction::Types::DBIC
203 =item Reaction::UI::ViewPort::ListView
205 =item Reaction::UI::ViewPort::Field::Text
207 =item Reaction::UI::ViewPort::Field::ChooseMany
209 =item Reaction::UI::ViewPort::Field::String
211 =item Reaction::UI::ViewPort::Field::Number
213 =item Reaction::UI::ViewPort::Field::HiddenArray
215 =item Reaction::UI::ViewPort::Field::DateTime
217 =item Reaction::UI::ViewPort::Field::File
219 =item Reaction::UI::ViewPort::Field::ChooseOne
221 =item Reaction::UI::ViewPort::Field::Password
223 =item Reaction::UI::ViewPort::ActionForm
225 =item Reaction::UI::ViewPort::Field
227 =item Reaction::UI::FocusStack
229 =item Reaction::UI::RootController
231 =item Reaction::UI::Window
233 =item Reaction::UI::Renderer::XHTML
235 =item Reaction::UI::ViewPort
237 =item Reaction::UI::CRUDController
239 =item Reaction::UI::Controller
243 =head3 Remarks about POD
245 Don't use C<=over N>. POD assumes that the indent level is 4 if you leave
246 it out. Most POD renderers ignore your indent level anyway.
252 t/lib/Rtest/TestDB*: TestDB DBIC declarations.
253 t/lib/RTest/TestDB.pm: does DBIC populate for t/.
256 Reaction::Test::WithDB;
258 Reaction::Test::Mock::Context;
259 Reaction::Test::Mock::Request;
260 Reaction::Test::Mock::Response;
264 See L<Reaction::Class> for authors.
268 See L<Reaction::Class> for the license.