package Memcached::libmemcached::API;

=head1 NAME

Memcached::libmemcached::API - Private volitile module

=head1 SYNOPSIS

    use Memcached::libmemcached::API;

    @function_names = libmemcached_functions();
    @constant_names = libmemcached_constants();
    @EXPORT_TAGS    = libmemcached_tags();

=head1 DESCRIPTION

This module should be considered private. It may change or be removed in future.

=head1 FUNCTIONS

=cut

use base qw(Exporter);
our @EXPORT = qw(
    libmemcached_functions
    libmemcached_constants
    libmemcached_tags
);

# load hash of libmemcached functions created by Makefile.PL
my $libmemcached_funcs = require "Memcached/libmemcached/func_hash.pl";
die "Memcached/libmemcached/func_hash.pl failed sanity check"
    unless ref $libmemcached_funcs eq 'HASH'
        and keys %$libmemcached_funcs > 20;

# extra functions provided by Memcached::libmemcached
my %libmemcached_extra_functions = (
    memcached_errstr => 1,
    memcached_mget_into_hashref => 1,
    memcached_set_callback_coderefs => 1,
);

# functions we don't provide an API for
my %libmemcached_unimplemented_functions = (
    # memcached_server_st
    memcached_server_push => 0,
    memcached_servers_parse => 0,
    memcached_server_list_append => 0,
    memcached_server_list_free => 0,
);

# build complete list of implemented functions
our @libmemcached_funcs = do {
    my %funcs = (
        %$libmemcached_funcs,
        %libmemcached_extra_functions,
        %libmemcached_unimplemented_functions
    );
    grep { $funcs{$_} } sort keys %funcs;
};


# load hash of libmemcached functions created by Makefile.PL
my $libmemcached_consts = require "Memcached/libmemcached/const_hash.pl";
die "Memcached/libmemcached/const_hash.pl failed sanity check"
    unless ref $libmemcached_consts eq 'HASH'
        and keys %$libmemcached_consts > 20;

our @libmemcached_consts = sort keys %$libmemcached_consts;


=head2 libmemcached_functions

  @names = libmemcached_functions();

Returns a list of all the public functions in the libmemcached library.

=cut

sub libmemcached_functions { @libmemcached_funcs } 


=head2 libmemcached_constants

  @names = libmemcached_constants();

Returns a list of all the constants in the libmemcached library.

=cut

sub libmemcached_constants { @libmemcached_consts } 


=head2 libmemcached_tags

  @tags = libmemcached_tags();

Returns a hash list of pairs of tag name and array references suitable for setting %EXPORT_TAGS.

=cut

sub libmemcached_tags {
    my %tags;
    push @{ $tags{ $libmemcached_consts->{$_} } }, $_
        for keys %$libmemcached_consts;
    #use Data::Dumper; warn Dumper(\%tags);
    return %tags;
} 

1;