e9729031e73a2f3cb5c4d72b31e0057a374a25ba
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Object / Trigger.pm
1 use MooseX::Declare;
2 class SQL::Translator::Object::Trigger extends SQL::Translator::Object {
3     use MooseX::Types::Moose qw(Any ArrayRef HashRef Int Str);
4     use MooseX::MultiMethods;
5     use SQL::Translator::Types qw(Column Schema Table ColumnHash IxHash);
6     use Tie::IxHash;
7
8     has 'schema' => (
9         is => 'rw',
10         isa => Schema,
11         weak_ref => 1,
12     );
13
14     has 'table' => (
15         is => 'rw',
16         isa => Table,
17         weak_ref => 1,
18     );
19
20     has 'name' => (
21         is => 'ro',
22         isa => Str,
23         required => 1
24     );
25
26     has 'columns' => (
27         is => 'rw',
28         isa => IxHash, #ColumnHash,
29         handles => {
30             exists_column => 'EXISTS',
31             column_ids    => 'Keys',
32             get_columns   => 'Values',
33             get_column    => 'FETCH',
34             add_column    => 'STORE',
35             remove_column => 'DELETE',
36             clear_columns => 'CLEAR',
37         },
38         coerce => 1,
39         default => sub { Tie::IxHash->new() }
40     );
41
42     has 'on_table' => (
43         is => 'rw', 
44         isa => Str,
45         required => 1,
46 #        trigger => sub { my ($self, $new, $old) = @_; $self->table($self->schema->get_table($new)) },
47     );
48
49     has 'action' => (
50         is => 'rw',
51         isa => Any
52     );
53
54     has 'perform_action_when' => (
55         is => 'rw',
56         isa => Str,
57         required => 1
58     );
59
60     has '_database_events' => (
61         traits => ['Array'],
62         isa => ArrayRef,
63         handles => {
64             _database_events            => 'elements',
65             add_database_event          => 'push',
66             remove_last_database_option => 'pop',
67         },
68         default => sub { [] },
69         required => 1,
70     );
71
72     has '_order' => (
73         isa => Int,
74         is => 'rw',
75     );
76
77     around add_column(Column $column) {
78         $self->$orig($column->name, $column);
79         return $self->get_column($column->name);
80     }
81
82     multi method database_events(Str $database_event) { $self->add_database_event($database_event); $self->database_events }
83     multi method database_events(ArrayRef $database_events) { $self->add_database_event($_) for @$database_events; $self->database_events }
84     multi method database_events { $self->_database_events }
85
86     multi method order(Int $order) { $self->_order($order); }
87     multi method order {
88         my $order = $self->_order;
89         unless (defined $order && $order) {
90             my $triggers = Tie::IxHash->new( map { $_->name => $_ } $self->schema->get_triggers );
91             $order = $triggers->Indices($self->name) || 0; $order++;
92             $self->_order($order);
93         }
94         return $order;
95     }
96
97     method is_valid { 1 }
98
99     around BUILDARGS(ClassName $self: @args) {
100         my $args = $self->$orig(@args);
101
102         my $database_events = delete $args->{database_events};
103         $args->{_database_events} = ref $database_events ? $database_events : [ $database_events ];
104
105         return $args;
106      }
107 }