Gideon

 view release on metacpan or  search on metacpan

lib/Gideon/Driver.pm  view on Meta::CPAN

package Gideon::Driver;
{
  $Gideon::Driver::VERSION = '0.0.3';
}
use Moose::Role;
use Gideon::Exceptions;

#ABSTRACT: Gideon Driver Interface

requires qw(_find _update _update_object _remove _remove_object _insert_object);

sub find {
    my ( $driver, $target, %query ) = @_;

    my $order = delete $query{-order};
    $driver->_find( $target, \%query, $order );
}

sub find_one {
    my ( $driver, $target, %query ) = @_;

    my $order = delete $query{-order};
    $driver->_find( $target, \%query, $order, 1 )->[0];
}

sub update {
    my ( $driver, $target, %changes ) = @_;

    my $is_object = ref $target;

    Gideon::Exception::ObjectNotInStore->throw
      if $is_object and not $target->__is_persisted;

    my $result =
        $is_object
      ? $driver->_update_object( $target, \%changes )
      : $driver->_update( $target, \%changes, {} );

    return $target if $result;
}

sub remove {
    my ( $driver, $target, %query ) = @_;

    my $is_object = ref $target;

    Gideon::Exception::ObjectNotInStore->throw
      if $is_object and not $target->__is_persisted;

    my $result =
        $is_object
      ? $driver->_remove_object($target)
      : $driver->_remove( $target, \%query );

    return $target if $result;
}

sub save {
    my ( $class, $target ) = @_;

    my $is_object = ref $target;

    Gideon::Exception::InvalidOperation->throw unless $is_object;

    my $result =
        $target->__is_persisted
      ? $class->_update_object($target)
      : $class->_insert_object($target);

    return $target if $result;
}

1;

__END__

=pod

=head1 NAME

Gideon::Driver - Gideon Driver Interface

=head1 VERSION

version 0.0.3



( run in 2.345 seconds using v1.01-cache-2.11-cpan-9581c071862 )