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 = %{ $self->merge_config_hashes($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 " . blessed($self)) 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::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
101 merged in with any arguments in the ViewPort attribute of the current
102 Catalyst action (also accessible through the controller config), add
103 it to the main FocusStack (C<$c-E<gt>stash-E<gt>{focus_stack}>) and
104 return the instantiated viewport.
106 TODO: explain how next_action as a scalar gets converted to the redirect arrayref thing
110 =head2 pop_viewport_to $vp
112 Shortcut to subs of the same name in the main FocusStack (C<$c-E<gt>stash-E<gt>{focus_stack}>)
114 =head2 redirect_to $c, $to, $captures, $args, $attrs
116 If C<$to> is a string then redirects to the action of the same name in the current
117 controller (C<$c-E<gt>controller> not C<$self>).
119 If C<$to> isa L<Catalyst::Action>
120 it will pass the argument directly to C<$c-E<gt>uri_for>.
122 If C<$to> is an ArrayRef with two items it will treat the first as a Controller name
123 and the second as the action name whithin that controller.
125 C<$captures>, C<$args>, and C<$attrs> are equivalent to the same arguments in
126 C<uri_for>. If left blank the current request captures and args will be used
127 and C<$attrs> will be passed as an empty HashRef.
131 See L<Reaction::Class> for authors.
135 See L<Reaction::Class> for the license.