Commit | Line | Data |
65b76960 |
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 | |
e49bd861 |
8 | foreach my $type (qw(select select_single insert update delete)) { |
65b76960 |
9 | has "${type}_sql" => (is => 'ro', predicate => "has_${type}_sql"); |
3347c67e |
10 | has "${type}_argument_order" => (is => 'ro', default => sub { [] }); |
65b76960 |
11 | } |
12 | |
3a2e7c1c |
13 | has 'insert_command_constructor' => (is => 'ro'); |
14 | |
3347c67e |
15 | has "select_column_order" => (is => 'ro'); |
16 | |
65b76960 |
17 | method new_select_command ($args) { |
18 | die "$self->has_select_sql" unless $self->has_select_sql; |
3347c67e |
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 | |
e49bd861 |
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 | |
3347c67e |
35 | method _unwrap_args_for ($type, $args) { |
36 | [ @{$args}{@{$self->${\"${type}_argument_order"}}} ] |
37 | } |
38 | |
3a2e7c1c |
39 | method _new_command ($builder, $type, $args) { |
3347c67e |
40 | my $has_meth = "has_${type}_sql"; |
41 | die "${self}->${has_meth}" unless $self->$has_meth; |
3a2e7c1c |
42 | $self->$builder( |
3347c67e |
43 | $self->${\"${type}_sql"}, |
3a2e7c1c |
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, |
3347c67e |
52 | ); |
65b76960 |
53 | } |
54 | |
55 | method new_insert_command ($args) { |
3a2e7c1c |
56 | my $builder = $self->insert_command_constructor; |
57 | $builder |
58 | ? $self->_new_command($builder => insert => $args) |
59 | : $self->_new_call_command(insert => $args); |
65b76960 |
60 | } |
61 | |
62 | method new_update_command ($args) { |
3347c67e |
63 | $self->_new_call_command(update => $args); |
65b76960 |
64 | } |
65 | |
66 | method new_delete_command ($args) { |
3347c67e |
67 | $self->_new_call_command(delete => $args); |
65b76960 |
68 | } |
69 | |
70 | __PACKAGE__->meta->make_immutable; |
71 | |
72 | 1; |