summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorfranck cuny <franck@lumberjaph.net>2010-08-31 15:40:13 +0200
committerfranck cuny <franck@lumberjaph.net>2010-08-31 15:40:13 +0200
commit945412cd8fad832f7bea42ac3191867287a9a3c0 (patch)
treef6b70e8fce7eefaa2ad01f8d1d3f3ed053d50af6 /lib
downloadnet-http-api-spec-945412cd8fad832f7bea42ac3191867287a9a3c0.tar.gz
initial import
Diffstat (limited to 'lib')
-rw-r--r--lib/Net/HTTP/API/Spec.pm46
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/Net/HTTP/API/Spec.pm b/lib/Net/HTTP/API/Spec.pm
new file mode 100644
index 0000000..37975c2
--- /dev/null
+++ b/lib/Net/HTTP/API/Spec.pm
@@ -0,0 +1,46 @@
+package Net::HTTP::API::Spec;
+
+use JSON;
+use Moose;
+use IO::All;
+
+use Net::HTTP::API::Core;
+
+sub load_from_spec {
+    my ($class, $spec_file) = @_;
+
+    my $content < io($spec_file);
+    my $spec = JSON::decode_json($content);
+
+    my $net_api_class =
+      Class::MOP::Class->create_anon_class(
+          superclasses => ['Net::HTTP::API::Core']);
+
+    my $net_api_object = $net_api_class->new_object;
+
+    $net_api_object = _declare_api($net_api_object, $spec->{declare});
+    $net_api_object = _add_methods($net_api_object, $spec->{methods});
+
+    $net_api_object;
+}
+
+sub _declare_api {
+    my ($api, $declaration_spec) = @_;
+
+    foreach my $k (keys %$declaration_spec) {
+        $api->meta->set_api_option($k => $declaration_spec->{$k});
+    }
+    $api;
+}
+
+sub _add_methods {
+    my ($class, $methods_spec) = @_;
+
+    foreach my $method_name (keys %$methods_spec) {
+        $class->meta->add_net_api_method($method_name,
+            %{$methods_spec->{$method_name}});
+    }
+    $class;
+}
+
+1;