NAME
Reaction::Manual::Internals
Hacking on Reaction
What is a component?
What component types are there?
How do I create a new component?
How does it work with a database?
What about Moose?
Type system
What Perl modules should I be familiar with, in order to hack on Reaction's internals?
- Moose
-
A complete modern object system for Perl 5.
- aliased
-
Use shorter package names, i.e., "X::Y::Z" as "Z".
- Catalyst
-
The MVC application framework Reaction uses.
- TT
-
Template Toolkit
- Config::General
-
Generic config file module.
- DBIx::Class
-
Object/Relational mapper.
- DateTime
- DateTime::Format::MySQL
- Digest::MD5
- Email::MIME
- Email::MIME::Creator
- Email::Send
- Email::Valid
- SQL::Translator
- Test::Class
- Test::Memory::Cycle
- Time::ParseDate
Packages involved
- Reaction::Class
-
Utility class, sets up to export a few methods that return parameters for use within Moose's
has
(as new parameters) in other packages. It alsouse
s Moose itself.The methods it injects are:
- set_or_lazy_build($field_name)
-
The attribute is required, if not provided beforehand the build_${name} method will be called on the object when the attribute's getter is first called. If the method does not exist, or returns undef, an error will be thrown.
- set_or_lazy_fail()
-
The attribute is required, if not provided beforehand the 'lazy' parameter of Moose will make it fail.
- trigger_adopt()
-
Calls adopt_${type} after the attribute value is set to $type.
- register_inc_entry()
-
Will mark the calling package as already included, using %INC.
- Reaction::InterfaceModel::Action
- Reaction::InterfaceModel::Action::DBIC::ResultSet::Create;
- Reaction::InterfaceModel::Action::DBIC::ActionReflector;
-
A method "adaptor" that creates the needed objects to support CRUD DBIC actions. In the future the code could be moved to a class higher in the hierarchy and only contain the operations to adapt.
Sample run:
Reaction::InterfaceModel::Action::DBIC::ActionReflector->reflect_actions_for( Reaction::InterfaceModel::Action::DBIC::ActionReflector=HASH(0x93cb2f0) RTest::TestDB::Foo ComponentUI::Model::Action )
Generates and evaluates:
package ComponentUI::Model::Action::DeleteFoo; use Reaction::Class; extends 'Reaction::InterfaceModel::Action::DBIC::Result::Delete'; package ComponentUI::Model::Action::UpdateFoo; use Reaction::Class; extends 'Reaction::InterfaceModel::Action::DBIC::Result::Update'; has 'baz_list' => (isa => 'ArrayRef', is => 'rw', set_or_lazy_fail('baz_list'), default => sub { [] }, valid_values => sub { $_[0]->target_model ->result_source ->related_source('links_to_baz_list') ->related_source('baz') ->resultset; }); has 'last_name' => (isa => 'NonEmptySimpleStr', is => 'rw', set_or_lazy_fail('last_name')); has 'first_name' => (isa => 'NonEmptySimpleStr', is => 'rw', set_or_lazy_fail('first_name')); package ComponentUI::Model::Action::CreateFoo; use Reaction::Class; extends 'Reaction::InterfaceModel::Action::DBIC::ResultSet::Create'; has 'baz_list' => (isa => 'ArrayRef', is => 'rw', set_or_lazy_fail('baz_list'), default => sub { [] }, valid_values => sub { $_[0]->target_model ->result_source ->related_source('links_to_baz_list') ->related_source('baz') ->resultset; }); has 'last_name' => (isa => 'NonEmptySimpleStr', is => 'rw', set_or_lazy_fail('last_name')); has 'first_name' => (isa => 'NonEmptySimpleStr', is => 'rw', set_or_lazy_fail('first_name'));
- Reaction::InterfaceModel::Action::DBIC::Result::Delete
- Reaction::InterfaceModel::Action::DBIC::Result::Update
- Reaction::InterfaceModel::Action::DBIC::User::ResetPassword
- Reaction::InterfaceModel::Action::DBIC::User::Role::SetPassword
- Reaction::InterfaceModel::Action::DBIC::User::ChangePassword
- Reaction::InterfaceModel::Action::User::ResetPassword
- Reaction::InterfaceModel::Action::User::ChangePassword
- Reaction::InterfaceModel::Action::User::SetPassword
- Reaction::Meta::InterfaceModel::Action::ParameterAttribute
- Reaction::Meta::InterfaceModel::Action::Class
- Reaction::Types::Email
- Reaction::Types::Core
- Reaction::Types::DateTime
- Reaction::Types::File
- Reaction::Types::DBIC
- Reaction::UI::ViewPort::ListView
- Reaction::UI::ViewPort::Field::Text
- Reaction::UI::ViewPort::Field::ChooseMany
- Reaction::UI::ViewPort::Field::String
- Reaction::UI::ViewPort::Field::Number
- Reaction::UI::ViewPort::Field::HiddenArray
- Reaction::UI::ViewPort::Field::DateTime
- Reaction::UI::ViewPort::Field::File
- Reaction::UI::ViewPort::Field::ChooseOne
- Reaction::UI::ViewPort::Field::Password
- Reaction::UI::ViewPort::ActionForm
- Reaction::UI::ViewPort::Field
- Reaction::UI::FocusStack
- Reaction::UI::RootController
- Reaction::UI::Window
- Reaction::UI::Renderer::XHTML
- Reaction::UI::ViewPort
- Reaction::UI::CRUDController
- Reaction::UI::Controller
Remarks about POD
Don't use =over N
. POD assumes that the indent level is 4 if you leave it out. Most POD renderers ignore your indent level anyway.
UNSORTED
Packages involved
t/lib/Rtest/TestDB*: TestDB DBIC declarations. t/lib/RTest/TestDB.pm: does DBIC populate for t/. t/lib/RTest/UI/ XXX
Reaction::Test::WithDB; Reaction::Test; Reaction::Test::Mock::Context; Reaction::Test::Mock::Request; Reaction::Test::Mock::Response;
AUTHORS
See Reaction::Class for authors.
LICENSE
See Reaction::Class for the license.