whitespace cleanup
[catagits/Catalyst-Runtime.git] / lib / Catalyst / ActionRole / ConsumesContent.pm
index 9638a2d..28b5350 100644 (file)
@@ -2,17 +2,50 @@ package Catalyst::ActionRole::ConsumesContent;
 
 use Moose::Role;
 
-requires 'match', 'match_captures';
+requires 'match', 'match_captures', 'list_extra_info';
 
 has allowed_content_types => (
   is=>'ro',
   required=>1,
   lazy=>1,
   isa=>'ArrayRef',
-  auto_deref=>1,
   builder=>'_build_allowed_content_types');
 
-sub _build_allowed_content_types { shift->attributes->{Consumes} }
+has normalized => (
+  is=>'ro',
+  required=>1,
+  lazy=>1,
+  isa=>'HashRef',
+  builder=>'_build_normalized');
+
+
+sub _build_normalized {
+  return +{
+    JSON => 'application/json',
+    JS => 'application/javascript',
+    PERL => 'application/perl',
+    HTML => 'text/html',
+    XML => 'text/XML',
+    Plain => 'text/plain',
+    UrlEncoded => 'application/x-www-form-urlencoded',
+    Multipart => 'multipart/form-data',
+    HTMLForm => ['application/x-www-form-urlencoded','multipart/form-data'],
+  };
+}
+
+sub _build_allowed_content_types {
+    my $self = shift;
+    my @proto = map {split ',', $_ } @{$self->attributes->{Consumes}};
+    my @converted = map {
+      if(my $normalized = $self->normalized->{$_}) {
+        ref $normalized ? @$normalized : ($normalized);
+      } else {
+        $_;
+      }
+    } @proto;
+
+    return \@converted;
+}
 
 around ['match','match_captures'] => sub {
     my ($orig, $self, $ctx, @args) = @_;
@@ -25,10 +58,18 @@ around ['match','match_captures'] => sub {
 sub can_consume {
     my ($self, $request_content_type) = @_;
     my @matches = grep { lc($_) eq lc($request_content_type) }
-      $self->allowed_content_types;
+      @{$self->allowed_content_types};
     return @matches ? 1:0;
 }
 
+around 'list_extra_info' => sub {
+  my ($orig, $self, @args) = @_;
+  return {
+    %{ $self->$orig(@args) },
+    CONSUMES => $self->allowed_content_types,
+  };
+};
+
 1;
 
 =head1 NAME
@@ -46,21 +87,21 @@ Catalyst::ActionRole::ConsumesContent - Match on HTTP Request Content-Type
       sub is_json       : Chained('start') Consumes('application/json') { ... }
       sub is_urlencoded : Chained('start') Consumes('application/x-www-form-urlencoded') { ... }
       sub is_multipart  : Chained('start') Consumes('multipart/form-data') { ... }
-      
+
       ## Alternatively, for common types...
 
-      sub is_json       : Chained('start') JSON { ... }
-      sub is_urlencoded : Chained('start') URLEncoded { ... }
-      sub is_multipart  : Chained('start') FormData { ... }
+      sub is_json       : Chained('start') Consume(JSON) { ... }
+      sub is_urlencoded : Chained('start') Consumes(UrlEncoded) { ... }
+      sub is_multipart  : Chained('start') Consumes(Multipart) { ... }
 
       ## Or allow more than one type
-      
+
       sub is_more_than_one
         : Chained('start')
         : Consumes('application/x-www-form-urlencoded')
         : Consumes('multipart/form-data')
       {
-        ## ... 
+        ## ...
       }
 
       1;
@@ -68,7 +109,7 @@ Catalyst::ActionRole::ConsumesContent - Match on HTTP Request Content-Type
 =head1 DESCRIPTION
 
 This is an action role that lets your L<Catalyst::Action> match on the content
-type of the incoming request.  
+type of the incoming request.
 
 Generally when there's a PUT or POST request, there's a request content body
 with a matching MIME content type.  Commonly this will be one of the types
@@ -102,6 +143,15 @@ allowed content types (see L</http_methods>) and zero otherwise.
 
 An array of strings that are the allowed content types for matching this action.
 
+=head2 can_consume
+
+Boolean.  Does the current request match content type with what this actionrole
+can consume?
+
+=head2 list_extra_info
+
+Add the accepted content type to the debug screen.
+
 =head1 AUTHORS
 
 Catalyst Contributors, see Catalyst.pm