package Qpsmtpd::DB;
use strict;
use warnings;

our @child_classes = qw(
    Qpsmtpd::DB::Redis
    Qpsmtpd::DB::File::DBM
);

sub new {
    my ( $class, %arg ) = @_;
    my @try_classes = @child_classes;
    if ( my $manual_class = delete $arg{class} ) {
        @try_classes = ( $manual_class );
    }
    my ( $child, @errors );
    for my $child_class ( @try_classes ) {
        eval "use $child_class";
        eval {
            $child = $child_class->new(%arg);
        };
        last if ! $@;
        push @errors, "Couldn't load $child_class: $@";
    }
    return $child if $child;
    die join( "\n", "Couldn't load any storage modules", @errors );
}

# noop default method for plugins that don't require locking
sub lock   { 1 }
sub unlock { 1 }

sub name {
    my ( $self, $name ) = @_;
    return $self->{name} = $name if $name;
    return $self->{name};
}

1;