1 package Reaction::UI::Controller;
5 Catalyst::Component::ACCEPT_CONTEXT
13 my $c = $self->context;
14 my $focus_stack = $c->stash->{focus_stack};
15 my ($class, @proto_args) = @_;
17 if (my $vp_attr = $c->stack->[-1]->attributes->{ViewPort}) {
18 if (ref($vp_attr) eq 'ARRAY') {
19 $vp_attr = $vp_attr->[0];
21 if (ref($vp_attr) eq 'HASH') {
22 if (my $conf_class = delete $vp_attr->{class}) {
25 %args = (%$vp_attr, @proto_args);
36 if (exists $args{next_action} && !ref($args{next_action})) {
37 $args{next_action} = [ $self, 'redirect_to', $args{next_action} ];
39 $focus_stack->push_viewport($class, %args);
43 return shift->context->stash->{focus_stack}->pop_viewport;
46 sub pop_viewports_to {
48 return $self->context->stash->{focus_stack}->pop_viewports_to($vp);
52 my ($self, $c, $to, $cap, $args, $attrs) = @_;
54 #the confess calls could be changed later to $c->log ?
57 $action = $self->action_for($to);
58 confess("Failed to locate action ${to} in " . $self->blessed) unless $action;
60 elsif( blessed $to && $to->isa('Catalyst::Action') ){
62 } elsif(ref $action eq 'ARRAY' && @$action == 2){ #is that overkill / too strict?
63 $action = $c->controller($to->[0])->action_for($to->[1]);
64 confess("Failed to locate action $to->[1] in $to->[0]" ) unless $action;
66 confess("Failed to locate action from ${to}");
69 $cap ||= $c->req->captures;
70 $args ||= $c->req->args;
72 my $uri = $c->uri_for($action, $cap, @$args, $attrs);
73 $c->res->redirect($uri);
82 Reaction::UI::Widget::Controller
86 Base Reaction Controller class. Inherits from:
90 =item L<Catalyst::Controller>
91 =item L<Catalyst::Component::ACCEPT_CONTEXT>
92 =item L<Reaction::Object>
98 =head2 push_viewport $vp_class, %args
100 Will create a new instance of $vp_class with the arguments of %args merged in with
101 any arguments in the ViewPort attribute of the current Catalyst action
102 (also accessible through the controller config), add it to the main FocusStack
103 (C<$c-E<gt>stash-E<gt>{focus_stack}>) and return the instantiated viewport.
105 TODO: explain how next_action as a scalar gets converted to the redirect arrayref thing
109 =head2 pop_viewport_to $vp
111 Shortcut to subs of the same name in the main FocusStack (C<$c-E<gt>stash-E<gt>{focus_stack}>)
113 =head2 redirect_to $c, $to, $captures, $args, $attrs
115 If C<$to> is a string then redirects to the action of the same name in the current
116 controller (C<$c-E<gt>controller> not C<$self>).
118 If C<$to> isa L<Catalyst::Action>
119 it will pass the argument directly to C<$c-E<gt>uri_for>.
121 If C<$to> is an ArrayRef with two items it will treat the first as a Controller name
122 and the second as the action name whithin that controller.
124 C<$captures>, C<$args>, and C<$attrs> are equivalent to the same arguments in
125 C<uri_for>. If left blank the current request captures and args will be used
126 and C<$attrs> will be passed as an empty HashRef.
130 See L<Reaction::Class> for authors.
134 See L<Reaction::Class> for the license.