File Coverage

lib/Catalyst/Action/REST/ForBrowsers.pm
Criterion Covered Total %
statement 13 13 100.0
branch n/a
condition n/a
subroutine 4 4 100.0
pod 1 1 100.0
total 18 18 100.0


line stmt bran cond sub pod time code
1             package Catalyst::Action::REST::ForBrowsers;
2             $Catalyst::Action::REST::ForBrowsers::VERSION = '1.21';
3 6     6   90080 use Moose;
  6         14  
  6         29  
4 6     6   31854 use namespace::autoclean;
  6         13  
  6         41  
5              
6             extends 'Catalyst::Action::REST';
7 6     6   3863 use Catalyst::Request::REST::ForBrowsers;
  6         16  
  6         1183  
8              
9             sub BUILDARGS {
10 6     6 1 13     my $class = shift;
11 6         10     my $config = shift;
12 6         37     Catalyst::Request::REST::ForBrowsers->_insert_self_into( $config->{class} );
13 6         150     return $class->SUPER::BUILDARGS( $config, @_ );
14             }
15              
16             override dispatch => sub {
17                 my $self = shift;
18                 my $c = shift;
19              
20                 my $req = $c->request();
21              
22                 return super()
23                     unless $req->can('looks_like_browser')
24                         && $req->looks_like_browser()
25                         && uc $c->request()->method() eq 'GET';
26              
27                 my $controller = $c->component( $self->class );
28                 my $rest_method = $self->name() . '_GET_html';
29              
30                 if ( $controller->action_for($rest_method)
31                     || $controller->can($rest_method) ) {
32              
33                     return $self->_dispatch_rest_method( $c, $rest_method );
34                 }
35              
36                 return super();
37             };
38              
39             __PACKAGE__->meta->make_immutable;
40              
41             1;
42              
43             =head1 NAME
44            
45             Catalyst::Action::REST::ForBrowsers - Automated REST Method Dispatching that Accommodates Browsers
46            
47             =head1 SYNOPSIS
48            
49             sub foo :Local :ActionClass('REST::ForBrowsers') {
50             ... do setup for HTTP method specific handlers ...
51             }
52            
53             sub foo_GET : Private {
54             ... do something for GET requests ...
55             }
56            
57             sub foo_GET_html : Private {
58             ... do something for GET requests from browsers ...
59             }
60            
61             sub foo_PUT : Private {
62             ... do something for PUT requests ...
63             }
64            
65             =head1 DESCRIPTION
66            
67             This class subclasses L<Catalyst::Action::REST> to add an additional
68             dispatching hook. If the request is a GET request I<and> the request looks
69             like it comes from a browser, it tries to dispatch to a C<GET_html> method
70             before trying to the C<GET> method instead. All other HTTP methods are
71             dispatched in the same way.
72            
73             For example, in the synopsis above, calling GET on "/foo" from a browser will
74             end up calling the C<foo_GET_html> method. If the request is I<not> from a
75             browser, it will call C<foo_GET>.
76            
77             See L<Catalyst::Action::REST> for more details on dispatching details.
78            
79             =head1 METHODS
80            
81             =over 4
82            
83             =item dispatch
84            
85             This method overrides the default dispatch mechanism to the re-dispatching
86             mechanism described above.
87            
88             =back
89            
90             =head1 SEE ALSO
91            
92             You likely want to look at L<Catalyst::Controller::REST>, which implements a
93             sensible set of defaults for a controller doing REST.
94            
95             This class automatically adds the
96             L<Catalyst::TraitFor::Request::REST::ForBrowsers> role to your request class.
97            
98             =head1 CONTRIBUTORS
99            
100             Dave Rolsky E<lt>autarch@urth.orgE<gt>
101            
102             =head1 COPYRIGHT
103            
104             Copyright the above named AUTHOR and CONTRIBUTORS
105            
106             =head1 LICENSE
107            
108             You may distribute this code under the same terms as Perl itself.
109            
110             =cut
111