aaee8ea426ccad1d7c46d97487198df8060069f3
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Object / Column.pm
1 use MooseX::Declare;
2 class SQL::Translator::Object::Column extends SQL::Translator::Object is dirty {
3     use MooseX::Types::Moose qw(Bool Int Maybe ScalarRef Str);
4     use MooseX::MultiMethods;
5     use SQL::Translator::Types qw(Bit Constraint Table Trigger);
6     clean;
7
8     use overload
9         '""'     => sub { shift->name },
10         'bool'   => sub { $_[0]->name || $_[0] },
11         fallback => 1,
12     ;
13
14     has 'table' => (
15         is => 'rw',
16         isa => Table,
17         weak_ref => 1,
18     );
19     
20     has 'name' => (
21         is => 'rw',
22         isa => Str,
23         required => 1,
24 #        trigger => sub { my ($self, $new, $old) = @_; if (defined $old) { $self->table->remove_column($old); $self->table->add_column($self) } }
25     );
26     
27     has 'data_type' => (
28         is => 'rw',
29         isa => Str,
30         required => 1,
31         default => '',
32         trigger => sub { my ($self, $new, $old) = @_; $self->is_auto_increment(1) if $new =~ /^serial$/i; },
33     );
34
35     has 'sql_data_type' => (
36         is => 'rw',
37         isa => Int,
38         required => 1,
39         default => 0
40     );
41     
42     has 'length' => (
43         is => 'rw',
44         isa => Int,
45         default => 0,
46         lazy => 1,
47         predicate => 'has_length',
48     );
49
50     has 'precision' => (
51         is => 'rw',
52         isa => Int,
53         default => 0,
54         lazy => 1,
55         predicate => 'has_precision',
56     );
57     
58     has 'is_nullable' => (
59         is => 'rw',
60         isa => Bit,
61         required => 1,
62         default => 1,
63     );
64
65     has 'is_unique' => (
66         is => 'rw',
67         isa => Bool,
68         default => 0,
69     );
70     
71     has 'default_value' => (
72         is => 'rw',
73         isa => Maybe[ScalarRef|Str],
74     );
75
76     has 'is_auto_increment' => (
77         is => 'rw',
78         isa => Bit,
79         required => 1,
80         coerce => 1,
81         default => 0
82     );
83
84     has 'is_primary_key' => (
85         is => 'rw',
86         isa => Bool,
87         default => 0
88     );
89
90     has 'is_foreign_key' => (
91         is => 'rw',
92         isa => Bool,
93         default => 0
94     );
95
96     has 'foreign_key_reference' => (
97          is => 'rw',
98          isa => Constraint,
99     );
100     
101     has 'trigger' => (
102         is => 'rw',
103         isa => Trigger,
104     );
105
106     has '_order' => (
107         is => 'rw',
108         isa => Int,
109     );
110
111     around size(@args) {
112         $self->$orig(@args) if @args;
113         my @sizes = $self->$orig;
114         return wantarray ? @sizes
115                          : join ',', @sizes;
116     }
117
118     method full_name { $self->table->name . '.' . $self->name }
119     method schema { $self->table->schema }
120
121     before name($name?) { die "Can't use column name $name" if defined $name && $self->table->exists_column($name) && $name ne $self->name }
122
123     multi method size(Str $size) { my ($length, $precision) = split /,/, $size; $self->length($length); $self->precision($precision) if $precision; $self->size }
124     multi method size(Int $length, Int $precision) { $self->length($length); $self->precision($precision); $self->size }
125     multi method size(ArrayRef $size) { $self->length($size->[0]); $self->precision($size->[1]) if @$size == 2; $self->size }
126
127     multi method size {
128         return $self->has_precision
129         ? wantarray
130             ? ($self->length, $self->precision) 
131             : join ',', ($self->length, $self->precision)
132         : $self->length;
133     }
134
135     multi method order(Int $order) { $self->_order($order); }
136     multi method order {
137         my $order = $self->_order;
138         unless (defined $order && $order) {
139             my $columns = Tie::IxHash->new( map { $_->name => $_ } $self->table->get_columns );
140             $order = $columns->Indices($self->name) || 0; $order++;
141             $self->_order($order);
142         }
143         return $order;
144     }
145
146     method BUILD(HashRef $args) {
147         die "Cannot use column name $args->{name}" if $args->{name} eq '';
148         $self->size($args->{size}) if $args->{size};
149     }
150 }