Commit | Line | Data |
4f4fd192 |
1 | use MooseX::Declare; |
072eb218 |
2 | class SQL::Translator::Object::Column extends SQL::Translator::Object is dirty { |
1ddd6d2a |
3 | use MooseX::Types::Moose qw(Bool Int Maybe ScalarRef Str); |
f49a2a49 |
4 | use MooseX::MultiMethods; |
3c557f72 |
5 | use SQL::Translator::Types qw(Bit Constraint Table Trigger); |
072eb218 |
6 | clean; |
7 | |
8 | use overload |
9 | '""' => sub { shift->name }, |
10 | 'bool' => sub { $_[0]->name || $_[0] }, |
11 | fallback => 1, |
12 | ; |
f49a2a49 |
13 | |
14 | has 'table' => ( |
15 | is => 'rw', |
16 | isa => Table, |
f49a2a49 |
17 | weak_ref => 1, |
18 | ); |
4f4fd192 |
19 | |
20 | has 'name' => ( |
21 | is => 'rw', |
22 | isa => Str, |
072eb218 |
23 | required => 1, |
bebe11d5 |
24 | trigger => sub { my ($self, $new, $old) = @_; if (defined $old) { $self->table->remove_column($old); $self->table->add_column($self) } } |
4f4fd192 |
25 | ); |
26 | |
27 | has 'data_type' => ( |
28 | is => 'rw', |
81429cb9 |
29 | isa => Str, |
072eb218 |
30 | required => 1, |
31 | default => '', |
e1bc9e4a |
32 | trigger => sub { my ($self, $new, $old) = @_; $self->is_auto_increment(1) if $new =~ /^serial$/i; }, |
81429cb9 |
33 | ); |
34 | |
35 | has 'sql_data_type' => ( |
36 | is => 'rw', |
4f4fd192 |
37 | isa => Int, |
072eb218 |
38 | required => 1, |
39 | default => 0 |
4f4fd192 |
40 | ); |
41 | |
958a3ef7 |
42 | has 'length' => ( |
4f4fd192 |
43 | is => 'rw', |
958a3ef7 |
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', |
4f4fd192 |
56 | ); |
57 | |
58 | has 'is_nullable' => ( |
59 | is => 'rw', |
2cb42d47 |
60 | isa => Bit, |
4f4fd192 |
61 | required => 1, |
62 | default => 1 |
63 | ); |
64 | |
4f4fd192 |
65 | has 'default_value' => ( |
66 | is => 'rw', |
1ddd6d2a |
67 | isa => Maybe[ScalarRef|Str], |
4f4fd192 |
68 | ); |
0874db2d |
69 | |
81429cb9 |
70 | has 'is_auto_increment' => ( |
71 | is => 'rw', |
ada068ed |
72 | isa => Bit, |
81429cb9 |
73 | required => 1, |
ada068ed |
74 | coerce => 1, |
81429cb9 |
75 | default => 0 |
76 | ); |
77 | |
0874db2d |
78 | has 'is_primary_key' => ( |
79 | is => 'rw', |
80 | isa => Bool, |
81 | default => 0 |
82 | ); |
70ada8ac |
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 | ); |
4f4fd192 |
94 | |
95 | has 'trigger' => ( |
96 | is => 'rw', |
97 | isa => Trigger, |
98 | ); |
0874db2d |
99 | |
70ada8ac |
100 | around size(@args) { |
101 | $self->$orig(@args) if @args; |
102 | my @sizes = $self->$orig; |
103 | return wantarray ? @sizes |
104 | : join ',', @sizes; |
105 | } |
b750d2f1 |
106 | |
8bd81980 |
107 | method full_name { $self->table->name . '.' . $self->name } |
108 | method schema { $self->table->schema } |
109 | |
b750d2f1 |
110 | method order { } |
111 | method is_unique { } |
8bd81980 |
112 | |
e8ef9a9b |
113 | before name($name?) { die "Can't use column name $name" if defined $name && $self->table->exists_column($name) && $name ne $self->name } |
958a3ef7 |
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 | |
a20ea10d |
119 | multi method size { |
958a3ef7 |
120 | return $self->has_precision |
121 | ? wantarray |
122 | ? ($self->length, $self->precision) |
123 | : join ',', ($self->length, $self->precision) |
124 | : $self->length; |
125 | } |
126 | |
e8ef9a9b |
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 | } |
4f4fd192 |
131 | } |