From 945412cd8fad832f7bea42ac3191867287a9a3c0 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Tue, 31 Aug 2010 15:40:13 +0200 Subject: initial import --- lib/Net/HTTP/API/Spec.pm | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/Net/HTTP/API/Spec.pm (limited to 'lib/Net/HTTP/API/Spec.pm') 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; -- cgit 1.4.1