work in progress, listview still broken
[catagits/Reaction.git] / lib / Reaction / UI / Controller / Collection.pm
CommitLineData
89b70ba7 1package Reaction::UI::Controller::Collection;
2
3use strict;
4use warnings;
5use base 'Reaction::UI::Controller';
6use Reaction::Class;
7
8use aliased 'Reaction::UI::ViewPort::ListView';
c8fbb8ad 9use aliased 'Reaction::UI::ViewPort::Object';
89b70ba7 10
11has 'model_name' => (isa => 'Str', is => 'rw', required => 1);
12has 'collection_name' => (isa => 'Str', is => 'rw', required => 1);
13
14has action_viewport_map => (isa => 'HashRef', is => 'rw', lazy_build => 1);
15has action_viewport_args => (isa => 'HashRef', is => 'rw', lazy_build => 1);
16
17sub _build_action_viewport_map {
18 return {
19 list => ListView,
c8fbb8ad 20 view => Object,
89b70ba7 21 };
22}
23
24sub _build_action_viewport_args {
25 return { };
26}
27
28sub base :Action :CaptureArgs(0) {
29 my ($self, $c) = @_;
30}
31
32#XXX candidate for futre optimization, should cache reader?
33sub get_collection {
34 my ($self, $c) = @_;
35 my $model = $c->model( $self->model_name );
36 my $attr = $model->meta->find_attribute_by_name( $self->collection_name );
37 my $reader = $attr->get_read_method;
38 return $model->$reader;
39}
40
41sub list :Chained('base') :PathPart('') :Args(0) {
42 my ($self, $c) = @_;
43 $c->forward(basic_page => [{ collection => $self->get_collection($c) }]);
44}
45
46sub object :Chained('base') :PathPart('id') :CaptureArgs(1) {
47 my ($self, $c, $key) = @_;
48 my $object :Stashed = $self->get_collection($c)->find($key);
49 confess "Object? what object?" unless $object; # should be a 404.
50}
51
52sub view :Chained('object') :Args(0) {
53 my ($self, $c) = @_;
54 my $object :Stashed;
c8fbb8ad 55 $c->forward(basic_page => [{model => $object}]);
89b70ba7 56}
57
58sub basic_page : Private {
59 my ($self, $c, $vp_args) = @_;
60 my $action_name = $c->stack->[-2]->name;
61 return $self->push_viewport
62 (
63 $self->action_viewport_map->{$action_name},
64 %{ $vp_args || {} },
65 %{ $self->action_viewport_args->{$action_name} || {} },
66 );
67}
68
691;