Update docs to match new ::Controller::Root
[catagits/Reaction.git] / lib / Reaction / UI / Controller.pm
CommitLineData
7adfd53f 1package Reaction::UI::Controller;
2
3use base qw/Catalyst::Controller::BindLex Reaction::Object/;
4use Reaction::Class;
5
6sub push_viewport {
7 my $self = shift;
8 my $focus_stack :Stashed;
9 my ($class, @proto_args) = @_;
10 my %args;
11 my $c = Catalyst::Controller::BindLex::_get_c_obj(4);
12 if (my $vp_attr = $c->stack->[-1]->attributes->{ViewPort}) {
13 if (ref($vp_attr) eq 'ARRAY') {
14 $vp_attr = $vp_attr->[0];
15 }
16 if (ref($vp_attr) eq 'HASH') {
17 if (my $conf_class = delete $vp_attr->{class}) {
18 $class = $conf_class;
19 }
20 %args = (%$vp_attr, @proto_args);
21 } else {
22 $class = $vp_attr;
23 %args = @proto_args;
24 }
25 } else {
26 %args = @proto_args;
27 }
28
29 $args{ctx} = $c;
30
31 if (exists $args{next_action} && !ref($args{next_action})) {
32 $args{next_action} = [ $self, 'redirect_to', $args{next_action} ];
33 }
34 $focus_stack->push_viewport($class, %args);
35}
36
37sub pop_viewport {
38 my $focus_stack :Stashed;
39 return $focus_stack->pop_viewport;
40}
41
42sub pop_viewports_to {
43 my ($self, $vp) = @_;
44 my $focus_stack :Stashed;
45 return $focus_stack->pop_viewports_to($vp);
46}
47
48sub redirect_to {
49 my ($self, $c, $to, $cap, $args, $attrs) = @_;
50
51 #the confess calls could be changed later to $c->log ?
52 my $action;
53 if(!ref $to){
54 $action = $self->action_for($to);
55 confess("Failed to locate action ${to} in " . $self->blessed) unless $action;
56 }
57 elsif( blessed $to && $to->isa('Catalyst::Action') ){
58 $action = $to;
59 } elsif(ref $action eq 'ARRAY' && @$action == 2){ #is that overkill / too strict?
60 $action = $c->controller($to->[0])->action_for($to->[1]);
61 confess("Failed to locate action $to->[1] in $to->[0]" ) unless $action;
62 } else{
63 confess("Failed to locate action from ${to}");
64 }
65
66 $cap ||= $c->req->captures;
67 $args ||= $c->req->args;
68 $attrs ||= {};
69 my $uri = $c->uri_for($action, $cap, @$args, $attrs);
70 $c->res->redirect($uri);
71}
72
731;