NAME

Rest::Client::Builder - Base class to build simple object-oriented REST clients

SYNOPSIS

        package Your::API;
        use base qw(Rest::Client::Builder);
        use JSON;

        sub new {
                my ($class) = @_;

                my $self;
                $self = $class->SUPER::new({
                        on_request => sub {
                                return $self->request(@_);
                        },
                }, 'http://hostname/api');
                return bless($self, $class);
        };

        sub request {
                my ($self, $method, $path, $args) = @_;
                return sprintf("%s %s %s\n", $method, $path, encode_json($args));
        }

        my $api = Your::API->new();
        print $api->resource->get({ value => 1 });
        # output: GET http://hostname/api/resource {"value":1}

        print $api->resource(10)->post({ value => 1 });
        # output: POST http://hostname/api/resource/10 {"value":1}

        print $api->resource(10)->subresource('alfa', 'beta')->state->put({ value => 1 });
        # output: PUT http://hostname/api/resource/10/subresource/alfa/beta/state {"value":1}

        print $api->resource(10)->subresource->alfa('beta')->state->put({ value => 1 });
        # output: PUT http://hostname/api/resource/10/subresource/alfa/beta/state {"value":1}

        print $api->resource(10)->subresource->alfa->beta->state->put({ value => 1 });
        # output: PUT http://hostname/api/resource/10/subresource/alfa/beta/state {"value":1}

        print $api->resource(10)->delete();
        # output: DELETE http://hostname/api/resource/10

METHODS

        get put post delete patch head

ADDITIONAL ARGUMENTS

You can pass any additionals arguments to the on_request callback:

        sub request {
                my ($self, $method, $path, $args, $opts) = @_;
        }

        my $api = Your::API->new();
        $api->resource->get({ value => 1 }, { timeout => 1 });

INHERITANCE

You can override any methods of any API object:

        package Your::API;
        use base qw(Rest::Client::Builder);
        use JSON;

        sub new {
                my ($class) = @_;

                my $self;
                $self = $class->SUPER::new({
                        on_request => sub {
                                return $self->request(@_);
                        },
                }, 'http://hostname/api');
                return bless($self, $class);
        };

        sub request {
                my ($self, $method, $path, $args) = @_;
                return encode_json($args);
        }

        package Your::API::resource::state;
        sub post {
                my ($self, $args) = (shift, shift);
                $args->{force} = 1;
                return $self->SUPER::post($args, @_);
        }

        my $api = Your::API->new();
        print $api->resource(1)->state->post();
        # output: {"force":1}

SEE ALSO

WWW::REST REST::Client

SUPPORT

You can find documentation for this module with the perldoc command.

        perldoc Rest::Client::Builder

You can also look for information at:

AUTHOR

Alexey A. Komarov <alexkom@cpan.org>

COPYRIGHT

2014 Alexey A. Komarov

LICENSE

This library is free software; you may redistribute it and/or modify it under the same terms as Perl itself.