move drop_* to Compat, change to around remove_* in lieu of multi method drop_*
[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     );
33
34     has 'sql_data_type' => (
35         is => 'rw',
36         isa => Int,
37         required => 1,
38         default => 0
39     );
40     
41     has 'length' => (
42         is => 'rw',
43         isa => Int,
44         default => 0,
45         lazy => 1,
46         predicate => 'has_length',
47     );
48
49     has 'precision' => (
50         is => 'rw',
51         isa => Int,
52         default => 0,
53         lazy => 1,
54         predicate => 'has_precision',
55     );
56     
57     has 'is_nullable' => (
58         is => 'rw',
59         isa => Bit,
60         required => 1,
61         default => 1
62     );
63     
64     has 'default_value' => (
65         is => 'rw',
66         isa => Maybe[ScalarRef|Str],
67     );
68
69     has 'is_auto_increment' => (
70         is => 'rw',
71         isa => Bit,
72         required => 1,
73         coerce => 1,
74         default => 0
75     );
76
77     has 'is_primary_key' => (
78         is => 'rw',
79         isa => Bool,
80         default => 0
81     );
82
83     has 'is_foreign_key' => (
84         is => 'rw',
85         isa => Bool,
86         default => 0
87     );
88
89     has 'foreign_key_reference' => (
90          is => 'rw',
91          isa => Constraint,
92     );
93     
94     has 'trigger' => (
95         is => 'rw',
96         isa => Trigger,
97     );
98
99     around size(@args) {
100         $self->$orig(@args) if @args;
101         my @sizes = $self->$orig;
102         return wantarray ? @sizes
103                          : join ',', @sizes;
104     }
105
106     method full_name { $self->table->name . '.' . $self->name }
107     method schema { $self->table->schema }
108
109     method order { }
110     method is_unique { }
111
112     before name($name?) { die "Can't use column name $name" if defined $name && $self->table->exists_column($name) && $name ne $self->name }
113
114     multi method size(Str $size) { my ($length, $precision) = split /,/, $size; $self->length($length); $self->precision($precision) if $precision; $self->size }
115     multi method size(Int $length, Int $precision) { $self->length($length); $self->precision($precision); $self->size }
116     multi method size(ArrayRef $size) { $self->length($size->[0]); $self->precision($size->[1]) if @$size == 2; $self->size }
117
118     multi method size(Any $) {
119         return $self->has_precision
120         ? wantarray
121             ? ($self->length, $self->precision) 
122             : join ',', ($self->length, $self->precision)
123         : $self->length;
124     }
125
126     method BUILD(HashRef $args) {
127         die "Cannot use column name $args->{name}" if $args->{name} eq '';
128         $self->size($args->{size}) if $args->{size}
129     }
130 }