1 package DBIx::Data::Store::CRUD;
4 use Method::Signatures::Simple;
6 has raw_store => (is => 'ro', required => 1); # DBIx::Data::Store object
8 foreach my $type (qw(select select_single insert update update_single delete delete_single)) {
9 has "${type}_sql" => (is => 'ro', predicate => "has_${type}_sql");
10 has "${type}_argument_order" => (is => 'ro', default => sub { [] });
13 has 'insert_command_constructor' => (is => 'ro');
15 has "select_column_order" => (is => 'ro');
17 method new_select_command ($args) {
18 die "$self->has_select_sql" unless $self->has_select_sql;
19 $self->raw_store->new_stream_command(
21 $self->_unwrap_args_for(select => $args),
22 $self->select_column_order
26 method new_select_single_command ($args) {
27 die "$self->has_select_single_sql" unless $self->has_select_single_sql;
28 $self->raw_store->new_row_command(
29 $self->select_single_sql,
30 $self->_unwrap_args_for(select_single => $args),
31 $self->select_column_order
35 method _unwrap_args_for ($type, $args) {
36 [ @{$args}{@{$self->${\"${type}_argument_order"}}} ]
39 method _new_command ($builder, $type, $args) {
40 my $has_meth = "has_${type}_sql";
41 die "${self}->${has_meth}" unless $self->$has_meth;
43 $self->${\"${type}_sql"},
44 $self->_unwrap_args_for($type => $args),
48 method _new_call_command ($type, $args) {
50 sub { shift->raw_store->new_call_command(@_) },
55 method new_insert_command ($args) {
56 my $builder = $self->insert_command_constructor;
58 ? $self->_new_command($builder => insert => $args)
59 : $self->_new_call_command(insert => $args);
62 method new_update_command ($args) {
63 $self->_new_call_command(update => $args);
66 method new_delete_command ($args) {
67 $self->_new_call_command(delete => $args);
70 method new_update_single_command ($args) {
71 $self->_new_call_command(update_single => $args);
74 method new_delete_single_command ($args) {
75 $self->_new_call_command(delete_single => $args);
78 __PACKAGE__->meta->make_immutable;