only allow Str now
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Object / Constraint.pm
1 use MooseX::Declare;
2 class SQL::Translator::Object::Constraint extends SQL::Translator::Object {
3     use MooseX::Types::Moose qw(ArrayRef Bool HashRef Int Maybe Str Undef);
4     use MooseX::MultiMethods;
5     use SQL::Translator::Types qw(Column MatchType Table ColumnHash IxHash);
6     use Tie::IxHash;
7
8     has 'table' => (
9         is => 'rw',
10         isa => Table,
11         weak_ref => 1,
12     );
13     
14     has 'name' => (
15         is => 'rw',
16         isa => Str,
17         default => '',
18         required => 1
19     );
20     
21     has 'columns' => (
22         is => 'rw',
23         isa => IxHash, #ColumnHash,
24         handles => {
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             has_columns   => 'Length',
32             clear_columns => 'CLEAR',
33         },
34         coerce => 1,
35         default => sub { Tie::IxHash->new() }
36     );
37     
38     has 'type' => (
39         is => 'rw',
40         isa => Str,
41         predicate => 'has_type',
42         required => 1,
43     );
44
45     has 'deferrable' => (
46         is => 'rw',
47         isa => Bool,
48         default => 1
49     );
50
51     has 'expression' => (
52         is => 'rw',
53         isa => Str,
54     );
55
56     has 'reference_table' => (
57         isa => Str,
58         is => 'rw',
59     );
60
61     has 'reference_columns' => (
62         isa => ArrayRef,
63         traits => ['Array'],
64         handles => {
65             reference_columns => 'elements',
66             add_reference_column => 'push',
67         },
68         default => sub { [] },
69         required => 1,
70     );
71
72     has 'match_type' => (
73         isa => MatchType,
74         is => 'rw',
75         coerce => 1,
76         lazy => 1,
77         default => ''
78     );
79
80     has '_order' => (
81         isa => Int,
82         is => 'rw',
83     );
84
85     has 'on_delete' => ( is => 'rw', required => 0);
86     has 'on_update' => ( is => 'rw', required => 0);
87
88     around add_column(Column $column does coerce) {
89         if ($self->has_type && $self->type eq 'PRIMARY KEY') {
90             $column->is_primary_key(1);
91         }
92         $column->table($self->table);
93         $self->$orig($column->name, $column);
94         return $self->get_column($column->name);
95     }
96
97     multi method order(Int $order) { $self->_order($order); }
98     multi method order {
99         my $order = $self->_order;
100         unless (defined $order && $order) {
101             my $tables = Tie::IxHash->new( map { $_->name => $_ } $self->schema->get_tables );
102             $order = $tables->Indices($self->name) || 0; $order++;
103             $self->_order($order);
104         }
105         return $order;
106     }
107
108     method is_valid { return $self->has_type && scalar $self->column_ids ? 1 : undef }
109
110     around BUILDARGS(ClassName $self: @args) {
111         my $args = $self->$orig(@args);
112
113         my $fields = delete $args->{fields} || [];
114
115         $fields = ref($fields) eq 'ARRAY' ? $fields : [ $fields ];
116         my $ix_hash = Tie::IxHash->new();
117         $ix_hash->STORE($_, SQL::Translator::Object::Column->new( name => $_ )) for @$fields;
118         $args->{columns} = $ix_hash;
119
120         return $args;
121      }
122 }