1 package Reaction::UI::Controller::Collection;
5 use base 'Reaction::UI::Controller';
8 use aliased 'Reaction::UI::ViewPort::ListView';
9 use aliased 'Reaction::UI::ViewPort::Object';
11 has 'model_name' => (isa => 'Str', is => 'rw', required => 1);
12 has 'collection_name' => (isa => 'Str', is => 'rw', required => 1);
14 has action_viewport_map => (isa => 'HashRef', is => 'rw', lazy_build => 1);
15 has action_viewport_args => (isa => 'HashRef', is => 'rw', lazy_build => 1);
17 sub _build_action_viewport_map {
24 sub _build_action_viewport_args {
28 #XXX candidate for futre optimization, should cache reader?
31 my $model = $c->model( $self->model_name );
32 my $collection = $self->collection_name;
33 if( my $meth = $model->can( $collection ) ){
35 } elsif ( my $attr = $model->meta->find_attribute_by_name($collection) ) {
36 my $reader = $attr->get_read_method;
37 return $model->$reader;
39 confess "Failed to find collection $collection";
42 sub base :Action :CaptureArgs(0) {
46 sub object :Chained('base') :PathPart('id') :CaptureArgs(1) {
47 my ($self, $c, $key) = @_;
48 my $object = $self->get_collection($c)->find($key);
49 $c->detach("/error_404") unless $object;
50 $c->stash(object => $object);
53 sub list :Chained('base') :PathPart('') :Args(0) {
55 $self->basic_page($c, { collection => $self->get_collection($c) });
58 sub view :Chained('object') :Args(0) {
60 $self->basic_page($c, { model => $c->stash->{object} });
64 my ($self, $c, $vp_args) = @_;
65 my $action_name = $c->stack->[-1]->name;
66 return $self->push_viewport
68 $self->action_viewport_map->{$action_name},
70 %{ $self->action_viewport_args->{$action_name} || {} },
81 Reaction::UI::Controller
85 Controller class used to make displaying collections easier.
86 Inherits from L<Reaction::UI::Controller>.
92 The name of the model this controller will use as it's data source. Should be a
93 name that can be passed to C<$C-E<gt>model>
95 =head2 collection_name
97 The name of the collection whithin the model that this Controller will be
100 =head2 action_viewport_map
104 =item B<_build_action_viewport_map> - Provided builder method, see METHODS
106 =item B<has_action_viewport_map> - Auto generated predicate
108 =item B<clear_action_viewport_map>- Auto generated clearer method
112 Read-write lazy building hashref. The keys should match action names in the
113 Controller and the value should be the ViewPort class that this action should
114 use. See method C<basic_page> for more info.
116 =head action_viewport_args
118 Read-write lazy building hashref. Additional ViewPort arguments for the action
119 named as the key in the controller. See method C<basic_page> for more info.
123 =item B<_build_action_viewport_args> - Provided builder method, see METHODS
125 =item B<has_action_viewport_args> - Auto generated predicate
127 =item B<clear_action_viewport_args>- Auto generated clearer method
133 =head2 get_collection $c
135 Returns an instance of the collection this controller uses.
137 =head2 _build_action_viewport_map
139 Provided builder for C<action_viewport_map>. Returns a hash with two items:
141 list => 'Reaction::UI::ViewPort::ListView',
142 view => 'Reaction::UI::ViewPort::Object',
144 =head2 _build_action_viewport_args
146 Returns an empty hashref.
148 =head2 basic_page $c, \%vp_args
150 Accepts two arguments, context, and a hashref of viewport arguments. It will
151 automatically determine the action name using the catalyst stack and call
152 C<push_viewport> with the ViewPort class name contained in the
153 C<action_viewport_map> with a set of options determined by merging C<$vp_args>
154 and the arguments contained in C<action_viewport_args>, if any.
164 Chain link, chained to C<base>. C<list> fetches the collection for the model
165 and calls C<basic_page> with a single argument, C<collection>.
167 The default ViewPort for this action is C<Reaction::UI::ViewPort::ListView> and
168 can be changed by altering the C<action_viewport_map> attribute hash.
172 Chain link, chained to C<base>, captures one argument, 'id'. Attempts to find
173 a single object by searching for a member of the current collection which has a
174 Primary Key or Unique constraint matching that argument. If the object is found
175 it is stored in the stash under the C<object> key.
179 Chain link, chained to C<object>. Calls C<basic page> with one argument,
180 C<model>, which contains an instance of the object fetched by the C<object>
183 The default ViewPort for this action is C<Reaction::UI::ViewPort::Object> and
184 can be changed by altering the C<action_viewport_map> attribute hash.
188 L<Reaction::UI::Controller>
192 See L<Reaction::Class> for authors.
196 See L<Reaction::Class> for the license.