add an around BUILDARGS to process fields arg properly
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Object / Constraint.pm
CommitLineData
4f4fd192 1use MooseX::Declare;
ebf2721d 2class SQL::Translator::Object::Constraint extends SQL::Translator::Object {
160f1f55 3 use MooseX::Types::Moose qw(ArrayRef Bool HashRef Int Maybe Str Undef);
035b8503 4 use MooseX::MultiMethods;
a499b4bd 5 use SQL::Translator::Types qw(Column MatchType Table ColumnHash IxHash);
6 use Tie::IxHash;
f49a2a49 7
8 has 'table' => (
9 is => 'rw',
10 isa => Table,
f49a2a49 11 weak_ref => 1,
12 );
4f4fd192 13
14 has 'name' => (
15 is => 'rw',
70ab6d8c 16 isa => Str,
17 default => '',
4f4fd192 18 required => 1
19 );
20
21 has 'columns' => (
4f4fd192 22 is => 'rw',
a499b4bd 23 isa => IxHash, #ColumnHash,
28bd628e 24 handles => {
a499b4bd 25 exists_column => 'EXISTS',
26 column_ids => 'Keys',
27 get_columns => 'Values',
28 get_column => 'FETCH',
29 add_column => 'STORE',
30 remove_column => 'DELETE',
31 clear_columns => 'CLEAR',
4f4fd192 32 },
a499b4bd 33 coerce => 1,
34 default => sub { Tie::IxHash->new() }
4f4fd192 35 );
36
37 has 'type' => (
38 is => 'rw',
39 isa => Str,
aa20eb7f 40 predicate => 'has_type',
ad203890 41 required => 1,
4f4fd192 42 );
526e74d1 43
b750d2f1 44 has 'deferrable' => (
45 is => 'rw',
46 isa => Bool,
075b652f 47 default => 1
b750d2f1 48 );
49
50 has 'expression' => (
51 is => 'rw',
52 isa => Str,
53 );
54
d63c8da0 55 has 'reference_table' => (
56 isa => Maybe[Str],
57 is => 'rw',
58 );
59
60 has 'reference_columns' => (
106f5e00 61 isa => ArrayRef,
62 traits => ['Array'],
63 handles => {
64 reference_columns => 'elements',
891ce668 65 add_reference_column => 'push',
106f5e00 66 },
67 default => sub { [] },
ad203890 68 required => 1,
cb13230a 69 );
70
71 has 'match_type' => (
3c557f72 72 isa => MatchType,
d191bceb 73 is => 'rw',
3c557f72 74 coerce => 1,
d191bceb 75 lazy => 1,
76 default => ''
d63c8da0 77 );
78
160f1f55 79 has '_order' => (
80 isa => Int,
81 is => 'rw',
82 );
83
4d662d4c 84 has 'on_delete' => ( is => 'rw', required => 0);
85 has 'on_update' => ( is => 'rw', required => 0);
86
801e0d4f 87 around add_column(Column $column does coerce) {
aa20eb7f 88 if ($self->has_type && $self->type eq 'PRIMARY KEY') {
89 $column->is_primary_key(1);
90 }
00e28941 91 $self->$orig($column->name, $column);
92 return $self->get_column($column->name);
aa20eb7f 93 }
94
160f1f55 95 multi method order(Int $order) { $self->_order($order); }
96 multi method order {
97 my $order = $self->_order;
98 unless (defined $order && $order) {
99 my $tables = Tie::IxHash->new( map { $_->name => $_ } $self->schema->get_tables );
100 $order = $tables->Indices($self->name) || 0; $order++;
101 $self->_order($order);
102 }
103 return $order;
104 }
105
aa20eb7f 106 method is_valid { return $self->has_type && scalar $self->column_ids ? 1 : undef }
d971846d 107
108 around BUILDARGS(ClassName $self: @args) {
109 my $args = $self->$orig(@args);
110
111 my $fields = delete $args->{fields} || [];
112
113 $fields = ref($fields) eq 'ARRAY' ? $fields : [ $fields ];
114 my $ix_hash = Tie::IxHash->new();
115 $ix_hash->STORE($_, SQL::Translator::Object::Column->new( name => $_ )) for @$fields;
116 $args->{columns} = $ix_hash;
117
118 return $args;
119 }
4f4fd192 120}