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) = @_;
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
## 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
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