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 => '', |
81429cb9 |
32 | ); |
33 | |
34 | has 'sql_data_type' => ( |
35 | is => 'rw', |
4f4fd192 |
36 | isa => Int, |
072eb218 |
37 | required => 1, |
38 | default => 0 |
4f4fd192 |
39 | ); |
40 | |
958a3ef7 |
41 | has 'length' => ( |
4f4fd192 |
42 | is => 'rw', |
958a3ef7 |
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', |
4f4fd192 |
55 | ); |
56 | |
57 | has 'is_nullable' => ( |
58 | is => 'rw', |
2cb42d47 |
59 | isa => Bit, |
4f4fd192 |
60 | required => 1, |
61 | default => 1 |
62 | ); |
63 | |
4f4fd192 |
64 | has 'default_value' => ( |
65 | is => 'rw', |
1ddd6d2a |
66 | isa => Maybe[ScalarRef|Str], |
4f4fd192 |
67 | ); |
0874db2d |
68 | |
81429cb9 |
69 | has 'is_auto_increment' => ( |
70 | is => 'rw', |
ada068ed |
71 | isa => Bit, |
81429cb9 |
72 | required => 1, |
ada068ed |
73 | coerce => 1, |
81429cb9 |
74 | default => 0 |
75 | ); |
76 | |
0874db2d |
77 | has 'is_primary_key' => ( |
78 | is => 'rw', |
79 | isa => Bool, |
80 | default => 0 |
81 | ); |
70ada8ac |
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 | ); |
4f4fd192 |
93 | |
94 | has 'trigger' => ( |
95 | is => 'rw', |
96 | isa => Trigger, |
97 | ); |
0874db2d |
98 | |
70ada8ac |
99 | around size(@args) { |
100 | $self->$orig(@args) if @args; |
101 | my @sizes = $self->$orig; |
102 | return wantarray ? @sizes |
103 | : join ',', @sizes; |
104 | } |
b750d2f1 |
105 | |
8bd81980 |
106 | method full_name { $self->table->name . '.' . $self->name } |
107 | method schema { $self->table->schema } |
108 | |
b750d2f1 |
109 | method order { } |
110 | method is_unique { } |
8bd81980 |
111 | |
e8ef9a9b |
112 | before name($name?) { die "Can't use column name $name" if defined $name && $self->table->exists_column($name) && $name ne $self->name } |
958a3ef7 |
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 | |
a20ea10d |
118 | multi method size { |
958a3ef7 |
119 | return $self->has_precision |
120 | ? wantarray |
121 | ? ($self->length, $self->precision) |
122 | : join ',', ($self->length, $self->precision) |
123 | : $self->length; |
124 | } |
125 | |
e8ef9a9b |
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 | } |
4f4fd192 |
130 | } |