diff options
| author | franck cuny <franck@lumberjaph.net> | 2010-07-16 16:10:41 +0200 |
|---|---|---|
| committer | franck cuny <franck@lumberjaph.net> | 2010-07-16 16:10:41 +0200 |
| commit | e97449eaa8bd3a408763057f9ca2253d93e2a3d0 (patch) | |
| tree | 4fd0dc6ed899efe361e314adfc913b9aa6b0a1a4 /lib/Net/HTTP/API/Meta/Method | |
| parent | check if auth_method is declared (diff) | |
| download | net-http-api-e97449eaa8bd3a408763057f9ca2253d93e2a3d0.tar.gz | |
rename from mx::net::api to net::http::api
Diffstat (limited to 'lib/Net/HTTP/API/Meta/Method')
| -rw-r--r-- | lib/Net/HTTP/API/Meta/Method/APIDeclare.pm | 57 | ||||
| -rw-r--r-- | lib/Net/HTTP/API/Meta/Method/APIMethod.pm | 115 |
2 files changed, 172 insertions, 0 deletions
diff --git a/lib/Net/HTTP/API/Meta/Method/APIDeclare.pm b/lib/Net/HTTP/API/Meta/Method/APIDeclare.pm new file mode 100644 index 0000000..8718eaa --- /dev/null +++ b/lib/Net/HTTP/API/Meta/Method/APIDeclare.pm @@ -0,0 +1,57 @@ +package Net::HTTP::API::Meta::Method::APIDeclare; + +# ABSTRACT: declare API + +use Moose::Role; +use Net::HTTP::API::Error; + +my @accepted_options = qw/ + api_base_url + api_format + api_format_mode + api_username + api_password + authentication + authentication_method + /; + +has api_options => ( + is => 'ro', + traits => ['Hash'], + isa => 'HashRef[Str|CodeRef]', + default => sub { {} }, + lazy => 1, + handles => { + set_api_option => 'set', + get_api_option => 'get', + }, +); + +sub add_net_api_declare { + my ($meta, $name, %options) = @_; + + if ($options{useragent}) { + die Net::HTTP::API::Error->new( + reason => "'useragent' must be a CODE ref") + unless ref $options{useragent} eq 'CODE'; + $meta->set_api_option(useragent => delete $options{useragent}); + } + + # XXX for backward compatibility + for my $attr (qw/base_url format format_mode username password/) { + my $attr_name = "api_" . $attr; + if (exists $options{$attr} && !exists $options{$attr_name}) { + $options{$attr_name} = delete $options{$attr}; + } + } + + for my $attr (@accepted_options) { + $meta->set_api_option($attr => $options{$attr}) if defined $options{$attr}; + } +} + +1; + +=head1 SYNOPSIS + +=head1 DESCRIPTION diff --git a/lib/Net/HTTP/API/Meta/Method/APIMethod.pm b/lib/Net/HTTP/API/Meta/Method/APIMethod.pm new file mode 100644 index 0000000..8303770 --- /dev/null +++ b/lib/Net/HTTP/API/Meta/Method/APIMethod.pm @@ -0,0 +1,115 @@ +package Net::HTTP::API::Meta::Method::APIMethod; + +# ABSTRACT: declare API method + +use Moose::Role; +use Net::HTTP::API::Error; +use Net::HTTP::API::Meta::Method; +use MooseX::Types::Moose qw/Str ArrayRef/; + +has local_net_api_methods => ( + traits => ['Array'], + is => 'rw', + isa => ArrayRef [Str], + required => 1, + default => sub { [] }, + auto_deref => 1, + handles => { + _find_net_api_method_by_name => 'first', + _add_net_api_method => 'push', + get_all_net_api_methods => 'elements', + }, +); + +sub find_net_api_method_by_name { + my ($meta, $name) = @_; + my $method_name = $meta->_find_net_api_method_by_name(sub {/^$name$/}); + return unless $method_name; + my $method = $meta->find_method_by_name($method_name); + if ($method->isa('Class::MOP::Method::Wrapped')) { + return $method->get_original_method; + } + else { + return $method; + } +} + +sub remove_net_api_method { + my ($meta, $name) = @_; + my @methods = grep { !/$name/ } $meta->get_all_net_api_methods; + $meta->local_net_api_methods(\@methods); + $meta->remove_method($name); +} + +before add_net_api_method => sub { + my ($meta, $name) = @_; + if ($meta->_find_net_api_method_by_name(sub {/^$name$/})) { + die Net::HTTP::API::Error->new( + reason => "method '$name' is already declared in " . $meta->name); + } +}; + +sub add_net_api_method { + my ($meta, $name, %options) = @_; + + # XXX accept blessed method ? + + my $code = delete $options{code}; + + $meta->add_method( + $name, + Net::HTTP::API::Meta::Method->wrap( + name => $name, + package_name => $meta->name, + body => $code, + %options + ), + ); + $meta->_add_net_api_method($name); +} + +after add_net_api_method => sub { + my ($meta, $name) = @_; + $meta->add_before_method_modifier( + $name, + sub { + my $self = shift; + die Net::HTTP::API::Error->new( + reason => "'api_base_url' have not been defined") + unless $self->api_base_url; + } + ); +}; + +1; + +=head1 SYNOPSIS + + my $api_client = MyAPI->new; + + my @methods = $api_client->meta->get_all_api_methods(); + + my $method = $api_client->meta->find_net_api_method_by_name('users'); + + $api_client->meta->remove_net_api_method($method); + + $api_client->meta->add_net_api_method('users', sub {...}, + description => 'this method does...',); + +=head1 DESCRIPTION + +=method get_all_net_api_methods + +Return a list of net api methods + +=method find_net_api_method_by_name + +Return a net api method + +=method remove_net_api_method + +Remove a net api method + +=method add_net_api_method + +Add a net api method |
