summary refs log tree commit diff
path: root/lib/MooseX
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/MooseX/Net/API/Role/Deserialize.pm30
1 files changed, 29 insertions, 1 deletions
diff --git a/lib/MooseX/Net/API/Role/Deserialize.pm b/lib/MooseX/Net/API/Role/Deserialize.pm
index b83c58a..cf69087 100644
--- a/lib/MooseX/Net/API/Role/Deserialize.pm
+++ b/lib/MooseX/Net/API/Role/Deserialize.pm
@@ -4,13 +4,21 @@ use Moose::Role;
 use JSON::XS;
 use YAML::Syck;
 use XML::Simple;
+use Try::Tiny;
+
+my $reverse_content_type = {
+    'application/json'   => 'json',
+    'application/x-yaml' => 'yaml',
+    'text/xml'           => 'xml',
+    'application/xml'    => 'xml',
+};
 
 sub _from_json {
     return decode_json( $_[1] );
 }
 
 sub _from_yaml {
-    return Dump $_[1];
+    return Load $_[1];
 }
 
 sub _from_xml {
@@ -18,4 +26,24 @@ sub _from_xml {
     $xml->XMLin( $_[1] );
 }
 
+sub _do_deserialization {
+    my ( $caller, $raw_content, @content_types ) = @_;
+
+    my $content;
+    foreach my $deserializer (@content_types) {
+        my $method;
+        if ( $reverse_content_type->{$deserializer} ) {
+            $method = '_from_' . $reverse_content_type->{$deserializer};
+        }
+        else {
+            $method = '_from_' . $deserializer;
+        }
+        next if ( !$caller->meta->find_method_by_name($method) );
+        try {
+            $content = $caller->$method($raw_content);
+        };
+        return $content if $content;
+    }
+}
+
 1;