From 931cbc8d6673ec352b369ae2f70f01ff96b4f507 Mon Sep 17 00:00:00 2001 From: groditi Date: Fri, 11 Sep 2009 13:36:16 +0000 Subject: initial refactor of CRUD controller actions as roles --- lib/Reaction/UI/Controller/Role/Action/Simple.pm | 134 +++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 lib/Reaction/UI/Controller/Role/Action/Simple.pm (limited to 'lib/Reaction/UI/Controller/Role/Action/Simple.pm') diff --git a/lib/Reaction/UI/Controller/Role/Action/Simple.pm b/lib/Reaction/UI/Controller/Role/Action/Simple.pm new file mode 100644 index 0000000..bf5ba16 --- /dev/null +++ b/lib/Reaction/UI/Controller/Role/Action/Simple.pm @@ -0,0 +1,134 @@ +package Reaction::UI::Controller::Role::Action::Simple; + +use Moose::Role -traits => 'MethodAttributes'; + +requires 'push_viewport'; +requires 'merge_config_hashes'; + +has action_viewport_map => (isa => 'HashRef', is => 'rw', lazy_build => 1); +has action_viewport_args => (isa => 'HashRef', is => 'rw', lazy_build => 1); + +sub _build_action_viewport_map { {} } + +sub _build_action_viewport_args { {} } + +sub setup_viewport { + my ($self, $c, $vp_args) = @_; + my $action_name = $c->stack->[-1]->name; + my $vp = $self->action_viewport_map->{$action_name}, + my $args = $self->merge_config_hashes( + $vp_args || {}, + $self->action_viewport_args->{$action_name} || {} , + ); + return $self->push_viewport($vp, %$args); +} + +1; + +__END__; + +=head1 NAME + +Reaction::UI::Controller::Role::Action::Simple + +=head1 DESCRIPTION + +Provides a C method, which makes it easier to setup and +configure a viewport in controller actions. + +=head1 SYNOPSYS + + package MyApp::Controller::Foo; + + use base 'Reaction::Controller'; + use Reaction::Class; + + with 'Reaction::UI::Controller::Role::Action::Simple'; + + __PACKAGE__->config( + action_viewport_map => { bar => 'Reaction::UI::Viewport::Object' }, + action_viewport_args => { location => 'custom-location' }, + ); + + sub bar :Local { + my($self, $c) = @_; + my $obj = $self->get_collection($c)->find( $some_key ); + $self->setup_viewport($c, { model => $obj }); + } + +=head1 ATTRIBUTES + +=head2 action_viewport_map + +=over 4 + +=item B<_build_action_viewport_map> - Returns empty hashref by default. + +=item B - Auto generated predicate + +=item B- Auto generated clearer method + +=back + +Read-write lazy building hashref. The keys should match action names in the +Controller and the value should be the ViewPort class that this action should +use. + +=head2 action_viewport_args + +Read-write lazy building hashref. Additional ViewPort arguments for the action +named as the key in the controller. + +=over 4 + +=item B<_build_action_viewport_args> - Returns empty hashref by default. + +=item B - Auto generated predicate + +=item B- Auto generated clearer method + +=back + +=head1 METHODS + +=head2 setup_viewport $c, \%vp_args + +Accepts two arguments, context, and a hashref of viewport arguments. It will +automatically determine the action name using the catalyst stack and call +C with the ViewPort class name contained in the +C with a set of options determined by merging C<$vp_args> +and the arguments contained in C, if any. + +=head1 SEE ALSO + +=over4 + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=item L + +=back + +=head1 AUTHORS + +See L for authors. + +=head1 LICENSE + +See L for the license. + +=cut -- cgit v1.2.3-54-g00ecf