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/APIMethod.pm | |
| 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/APIMethod.pm')
| -rw-r--r-- | lib/Net/HTTP/API/Meta/Method/APIMethod.pm | 115 |
1 files changed, 115 insertions, 0 deletions
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 |
