rename update/delete to update_single/delete_single
[dbsrgits/DBIx-Data-Store-old.git] / lib / DBIx / Data / Store / CRUD.pm
1 package DBIx::Data::Store::CRUD;
2
3 use Moose;
4 use Method::Signatures::Simple;
5
6 has raw_store => (is => 'ro', required => 1); # DBIx::Data::Store object
7
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 { [] });
11 }
12
13 has 'insert_command_constructor' => (is => 'ro');
14
15 has "select_column_order" => (is => 'ro');
16
17 method new_select_command ($args) {
18   die "$self->has_select_sql" unless $self->has_select_sql;
19   $self->raw_store->new_stream_command(
20     $self->select_sql,
21     $self->_unwrap_args_for(select => $args),
22     $self->select_column_order
23   );
24 }
25
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
32   );
33 }
34
35 method _unwrap_args_for ($type, $args) {
36   [ @{$args}{@{$self->${\"${type}_argument_order"}}} ]
37 }
38
39 method _new_command ($builder, $type, $args) {
40   my $has_meth = "has_${type}_sql";
41   die "${self}->${has_meth}" unless $self->$has_meth;
42   $self->$builder(
43     $self->${\"${type}_sql"},
44     $self->_unwrap_args_for($type => $args),
45   );
46 }
47
48 method _new_call_command ($type, $args) {
49   $self->_new_command(
50     sub { shift->raw_store->new_call_command(@_) },
51     $type => $args,
52   );
53 }
54
55 method new_insert_command ($args) {
56   my $builder = $self->insert_command_constructor;
57   $builder
58     ? $self->_new_command($builder => insert => $args)
59     : $self->_new_call_command(insert => $args);
60 }
61
62 method new_update_command ($args) {
63   $self->_new_call_command(update => $args);
64 }
65
66 method new_delete_command ($args) {
67   $self->_new_call_command(delete => $args);
68 }
69
70 method new_update_single_command ($args) {
71   $self->_new_call_command(update_single => $args);
72 }
73
74 method new_delete_single_command ($args) {
75   $self->_new_call_command(delete_single => $args);
76 }
77
78 __PACKAGE__->meta->make_immutable;
79
80 1;