package DR::Tarantool;

=head1 NAME

DR::Tarantool - perl driver for L<tarantool|http://tarantool.org>


=head1 SYNOPSIS

   use DR::Tarantool ':constant', 'tarantool';
   use DR::Tarantool ':all';

   my $tnt = tarantool
       host    => '127.0.0.1',
       port    => 123,
       spaces  => {
           ...
       }
   ;

   $tnt->update( ... );

   my $tnt = coro_tarantool
       host    => '127.0.0.1',
       port    => 123,
       spaces  => {
           ...
       }
   ;

   use DR::Tarantool ':constant', 'async_tarantool';

   async_tarantool
       host    => '127.0.0.1',
       port    => 123,
       spaces  => {
           ...
       },
       sub {
           ...
       }
   ;

   $tnt->update(...);

=head1 DESCRIPTION

The module provides sync and async drivers for
L<tarantool|http://tarantool.org>.

The driver uses libtarantool* libraries for making requests and
parsing responses.

=cut

use 5.008008;
use strict;
use warnings;
use Carp;
$Carp::Internal{ (__PACKAGE__) }++;

use base qw(Exporter);


our %EXPORT_TAGS = (
   client      => [ qw( tarantool async_tarantool coro_tarantool) ],
   constant    => [
       qw(
           TNT_INSERT TNT_SELECT TNT_UPDATE TNT_DELETE TNT_CALL TNT_PING
           TNT_FLAG_RETURN TNT_FLAG_ADD TNT_FLAG_REPLACE TNT_FLAG_BOX_QUIET
           TNT_FLAG_NOT_STORE
       )
   ],
);

our @EXPORT_OK = ( map { @$_ } values %EXPORT_TAGS );
$EXPORT_TAGS{all} = \@EXPORT_OK;
our @EXPORT = @{ $EXPORT_TAGS{client} };
our $VERSION = '0.35';


=head1 EXPORT

=head2 tarantool

connects to L<tarantool|http://tarantool.org> in sync mode using
L<DR::Tarantool::SyncClient>.


=cut

sub tarantool {
   require DR::Tarantool::SyncClient;
   no warnings 'redefine';
   *tarantool = sub {
       DR::Tarantool::SyncClient->connect(@_);
   };
   goto \&tarantool;
}


=head2 async_tarantool

connects to L<tarantool|http://tarantool.org> in async mode using
L<DR::Tarantool::AsyncClient>.

=cut

sub async_tarantool {
   require DR::Tarantool::AsyncClient;
   no warnings 'redefine';
   *async_tarantool = sub {
       DR::Tarantool::AsyncClient->connect(@_);
   };
   goto \&async_tarantool;
}


=head2 coro_tarantol

connects to L<tarantool|http://tarantool.org> in async mode using
L<DR::Tarantool::CoroClient>.


=cut

sub coro_tarantool {
   require DR::Tarantool::CoroClient;
   no warnings 'redefine';
   *coro_tarantool = sub {
       DR::Tarantool::CoroClient->connect(@_);
   };
   goto \&coro_tarantool;
}


=head2 :constant

Exports constants to use in request as flags:

=over

=item TNT_FLAG_RETURN

If You use the flag, driver will return tuple that were
inserted/deleted/updated.

=item TNT_FLAG_ADD

Try to add tuple. Return error if tuple is already exists.

=item TNT_FLAG_REPLACE

Try to replace tuple. Return error if tuple isn't exists.

=back

=cut

require XSLoader;
XSLoader::load('DR::Tarantool', $VERSION);



=head2 :all

Exports all functions and constants.


=head1 SEE ALSO

The module uses L<DR::Tarantool::SyncClient> and (or)
L<DR::Tarantool::AsyncClient>.

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2011 Dmitry E. Oboukhov <[email protected]>
Copyright (C) 2011 Roman V. Nikolaev <[email protected]>

This program is free software, you can redistribute it and/or
modify it under the terms of the Artistic License.

=head1 VCS

The project is placed git repo on github:
L<https://github.com/dr-co/dr-tarantool/>.

=cut

1;