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.20';
3 6     6   134396 use Moose;
  6         15  
  6         57  
4 6     6   41947 use namespace::autoclean;
  6         14  
  6         66  
5              
6             extends 'Catalyst::Action::REST';
7 6     6   4387 use Catalyst::Request::REST::ForBrowsers;
  6         20  
  6         2006  
8              
9             sub BUILDARGS {
10 6     6 1 17 my $class = shift;
11 6         19 my $config = shift;
12 6         71 Catalyst::Request::REST::ForBrowsers->_insert_self_into( $config->{class} );
13 6         248 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