diff options
Diffstat (limited to '')
-rw-r--r-- | lib/MooseX/Net/API/Meta/Class.pm | 16 | ||||
-rw-r--r-- | lib/MooseX/Net/API/Meta/Method.pm | 229 | ||||
-rw-r--r-- | lib/MooseX/Net/API/Meta/Method/APIDeclare.pm | 57 | ||||
-rw-r--r-- | lib/MooseX/Net/API/Meta/Method/APIMethod.pm | 115 |
4 files changed, 0 insertions, 417 deletions
diff --git a/lib/MooseX/Net/API/Meta/Class.pm b/lib/MooseX/Net/API/Meta/Class.pm deleted file mode 100644 index ad1b709..0000000 --- a/lib/MooseX/Net/API/Meta/Class.pm +++ /dev/null @@ -1,16 +0,0 @@ -package MooseX::Net::API::Meta::Class; - -# ABSTRACT: metaclass for all API client - -use Moose::Role; - -with qw/ - MooseX::Net::API::Meta::Method::APIMethod - MooseX::Net::API::Meta::Method::APIDeclare - /; - -1; - -=head1 SYNOPSIS - -=head1 DESCRIPTION diff --git a/lib/MooseX/Net/API/Meta/Method.pm b/lib/MooseX/Net/API/Meta/Method.pm deleted file mode 100644 index 8879e04..0000000 --- a/lib/MooseX/Net/API/Meta/Method.pm +++ /dev/null @@ -1,229 +0,0 @@ -package MooseX::Net::API::Meta::Method; - -# ABSTRACT: create api method - -use Moose; -use MooseX::Net::API::Error; -use Moose::Util::TypeConstraints; - -use MooseX::Types::Moose qw/Str Int ArrayRef/; - -extends 'Moose::Meta::Method'; - -subtype UriPath - => as 'Str' - => where { $_ =~ m!^/! } - => message {"path must start with /"}; - -enum Method => qw(HEAD GET POST PUT DELETE); - -has path => (is => 'ro', isa => 'UriPath', required => 1, coerce => 1); -has method => (is => 'ro', isa => 'Method', required => 1); -has description => (is => 'ro', isa => 'Str', predicate => 'has_description'); -has strict => (is => 'ro', isa => 'Bool', default => 1,); -has authentication => ( - is => 'ro', - isa => 'Bool', - predicate => 'has_authentication', - default => 0 -); -has expected => ( - traits => ['Array'], - is => 'ro', - isa => ArrayRef [Int], - auto_deref => 1, - required => 0, - predicate => 'has_expected', - handles => {find_expected_code => 'grep',}, -); -has params => ( - traits => ['Array'], - is => 'ro', - isa => ArrayRef [Str], - required => 0, - default => sub { [] }, - auto_deref => 1, - handles => {find_request_parameter => 'first',} -); -has params_in_url => ( - traits => ['Array'], - is => 'ro', - isa => ArrayRef [Str], - required => 0, - default => sub { [] }, - auto_deref => 0, - handles => {find_request_url_parameters => 'first'} -); -has required => ( - traits => ['Array'], - is => 'ro', - isa => ArrayRef [Str], - default => sub { [] }, - auto_deref => 1, - required => 0, -); -has documentation => ( - is => 'ro', - isa => 'Str', - lazy => 1, - default => sub { - my $self = shift; - my $doc; - $doc .= "name: " . $self->name . "\n"; - $doc .= "description: " . $self->description . "\n" - if $self->has_description; - $doc .= "method: " . $self->method . "\n"; - $doc .= "path: " . $self->path . "\n"; - $doc .= "arguments: " . join(', ', $self->params) . "\n" - if $self->params; - $doc .= "required: " . join(', ', $self->required) . "\n" - if $self->required; - $doc; - } -); - -before wrap => sub { - my ($class, %args) = @_; - - if (!$args{params} && $args{required}) { - die MooseX::Net::API::Error->new( - reason => "You can't require a param that have not been declared"); - } - - if ( $args{required} ) { - foreach my $required ( @{ $args{required} } ) { - die MooseX::Net::API::Error->new( reason => - "$required is required but is not declared in params" ) - if ( !grep { $_ eq $required } @{ $args{params} }, @{$args{params_in_url}} ); - } - } -}; - -sub wrap { - my ($class, %args) = @_; - - if (!defined $args{body}) { - my $code = sub { - my ($self, %method_args) = @_; - - my $method = $self->meta->find_net_api_method_by_name($args{name}); - - $method->_validate_before_execute(\%method_args); - my $path = $method->_build_path(\%method_args); - my $local_url = $method->_build_uri($self, $path); - - my $result = $self->http_request( - $method->method => $local_url, - $method->params_in_url, \%method_args - ); - - my $code = $result->code; - - if ($method->has_expected - && !$method->find_expected_code(sub {/$code/})) - { - die MooseX::Net::API::Error->new( - reason => "unexpected code", - http_error => $result - ); - } - - my $content = $self->get_content($result);; - - if ($result->is_success) { - if (wantarray) { - return ($content, $result); - } - else { - return $content; - } - } - - die MooseX::Net::API::Error->new( - http_error => $result, - reason => $result->message, - ); - }; - $args{body} = $code; - } - - $class->SUPER::wrap(%args); -} - -sub _validate_before_execute { - my ($self, $args) = @_; - for my $method (qw/_check_params_before_run _check_required_before_run/) { - $self->$method($args); - } -} - -sub _check_params_before_run { - my ($self, $args) = @_; - - return if !$self->strict; - - # check if there is no undeclared param - foreach my $arg (keys %$args) { - if ( !$self->find_request_parameter(sub {/$arg/}) - && !$self->find_request_url_parameters(sub {/$arg/})) - { - die MooseX::Net::API::Error->new( - reason => "'$arg' is not declared as a param"); - } - } -} - -sub _check_required_before_run { - my ($self, $args) = @_; - - # check if all our params declared as required are present - foreach my $required ($self->required) { - if (!grep { $required eq $_ } keys %$args) { - die MooseX::Net::API::Error->new(reason => - "'$required' is declared as required, but is not present"); - } - } -} - -sub _build_path { - my ($self, $args) = @_; - my $path = $self->path; - - my $max_iter = keys %$args; - my $i = 0; - while ($path =~ /(?:\$|:)(\w+)/g) { - my $match = $1; - $i++; - if (my $value = delete $args->{$match}) { - $path =~ s/(?:\$|:)$match/$value/; - } - if ($max_iter > $i) { - $path =~ s/(?:\/((?:\$|\:).*))?$//; - } - } - $path =~ s/(?:\/((?:\$|\:).*))?$//; - return $path; -} - -sub _build_uri { - my ($method, $self, $path) = @_; - - my $local_url = $self->api_base_url->clone; - my $path_url_base = $local_url->path; - $path_url_base =~ s/\/$// if $path_url_base =~ m!/$!; - $path_url_base .= $path; - - if ($self->api_format && $self->api_format_mode eq 'append') { - my $format = $self->api_format; - $path_url_base .= "." . $format; - } - - $local_url->path($path_url_base); - return $local_url; -} - -1; - -=head1 SYNOPSIS - -=head1 DESCRIPTION diff --git a/lib/MooseX/Net/API/Meta/Method/APIDeclare.pm b/lib/MooseX/Net/API/Meta/Method/APIDeclare.pm deleted file mode 100644 index 0de38df..0000000 --- a/lib/MooseX/Net/API/Meta/Method/APIDeclare.pm +++ /dev/null @@ -1,57 +0,0 @@ -package MooseX::Net::API::Meta::Method::APIDeclare; - -# ABSTRACT: declare API - -use Moose::Role; -use MooseX::Net::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 MooseX::Net::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/MooseX/Net/API/Meta/Method/APIMethod.pm b/lib/MooseX/Net/API/Meta/Method/APIMethod.pm deleted file mode 100644 index 0ddcacd..0000000 --- a/lib/MooseX/Net/API/Meta/Method/APIMethod.pm +++ /dev/null @@ -1,115 +0,0 @@ -package MooseX::Net::API::Meta::Method::APIMethod; - -# ABSTRACT: declare API method - -use Moose::Role; -use MooseX::Net::API::Error; -use MooseX::Net::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 MooseX::Net::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, - MooseX::Net::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 MooseX::Net::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 |