25dfd30717b901527b903be9002e5b5ab61348c2
[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 'default_value' => (
66         is => 'rw',
67         isa => Maybe[ScalarRef|Str],
68     );
69
70     has 'is_auto_increment' => (
71         is => 'rw',
72         isa => Bit,
73         required => 1,
74         coerce => 1,
75         default => 0
76     );
77
78     has 'is_primary_key' => (
79         is => 'rw',
80         isa => Bool,
81         default => 0
82     );
83
84     has 'is_foreign_key' => (
85         is => 'rw',
86         isa => Bool,
87         default => 0
88     );
89
90     has 'foreign_key_reference' => (
91          is => 'rw',
92          isa => Constraint,
93     );
94     
95     has 'trigger' => (
96         is => 'rw',
97         isa => Trigger,
98     );
99
100     around size(@args) {
101         $self->$orig(@args) if @args;
102         my @sizes = $self->$orig;
103         return wantarray ? @sizes
104                          : join ',', @sizes;
105     }
106
107     method full_name { $self->table->name . '.' . $self->name }
108     method schema { $self->table->schema }
109
110     method order { }
111     method is_unique { }
112
113     before name($name?) { die "Can't use column name $name" if defined $name && $self->table->exists_column($name) && $name ne $self->name }
114
115     multi method size(Str $size) { my ($length, $precision) = split /,/, $size; $self->length($length); $self->precision($precision) if $precision; $self->size }
116     multi method size(Int $length, Int $precision) { $self->length($length); $self->precision($precision); $self->size }
117     multi method size(ArrayRef $size) { $self->length($size->[0]); $self->precision($size->[1]) if @$size == 2; $self->size }
118
119     multi method size {
120         return $self->has_precision
121         ? wantarray
122             ? ($self->length, $self->precision) 
123             : join ',', ($self->length, $self->precision)
124         : $self->length;
125     }
126
127     method BUILD(HashRef $args) {
128         die "Cannot use column name $args->{name}" if $args->{name} eq '';
129         $self->size($args->{size}) if $args->{size}
130     }
131 }