return values when using native traits
[dbsrgits/SQL-Translator-2.0-ish.git] / lib / SQL / Translator / Object / Schema.pm
1 use MooseX::Declare;
2 class SQL::Translator::Object::Schema extends SQL::Translator::Object {
3     use MooseX::Types::Moose qw(HashRef Maybe Str);
4     use MooseX::MultiMethods;
5     use Tie::IxHash;
6     use SQL::Translator::Types qw(Procedure Table Trigger View ProcedureHash TableHash TriggerHash ViewHash IxHash);
7  
8     has 'name' => (
9         is => 'rw',
10         isa => Maybe[Str],
11         required => 1,
12         default => ''
13     );
14
15     has 'database' => (
16         is => 'rw',
17         isa => Maybe[Str],
18     );
19     
20     has 'tables' => (
21         is => 'rw',
22         isa => IxHash, #TableHash,
23         handles => {
24             exists_table => 'EXISTS',
25             table_ids    => 'Keys',
26             get_tables   => 'Values',
27             get_table    => 'FETCH',
28             add_table    => 'STORE',
29             remove_table => 'DELETE',
30         },
31         coerce => 1,
32         default => sub { Tie::IxHash->new() }
33     );
34     
35     has 'views' => (
36         is => 'rw',
37         isa => IxHash, #ViewHash,
38         handles => {
39             exists_view => 'EXISTS',
40             view_ids    => 'Keys',
41             get_views   => 'Values',
42             get_view    => 'FETCH',
43             add_view    => 'STORE',
44             remove_view => 'DELETE',
45         },
46         coerce => 1,
47         default => sub { Tie::IxHash->new() }
48     );
49     
50     has 'procedures' => (
51         is => 'rw',
52         isa => IxHash, #ProcedureHash,
53         handles => {
54             exists_procedure => 'EXISTS',
55             procedure_ids    => 'Keys',
56             get_procedures   => 'Values',
57             get_procedure    => 'FETCH',
58             add_procedure    => 'STORE',
59             remove_procedure => 'DELETE',
60         },
61         coerce => 1,
62         default => sub { Tie::IxHash->new() }
63     );
64
65     has 'triggers' => (
66         is => 'rw',
67         isa => IxHash, #TriggerHash,
68         handles => {
69             exists_trigger => 'EXISTS',
70             trigger_ids    => 'Keys',
71             get_triggers   => 'Values',
72             get_trigger    => 'FETCH',
73             add_trigger    => 'STORE',
74             remove_trigger => 'DELETE',
75         },
76         coerce => 1,
77         default => sub { Tie::IxHash->new() }
78     );
79
80     around add_table(Table $table does coerce) {
81         die "Can't use table name " . $table->name if $self->exists_table($table->name) || $table->name eq '';
82         $table->schema($self);
83         $self->$orig($table->name, $table);
84         return $self->get_table($table->name);
85     }
86
87     around add_view(View $view does coerce) {
88         die "Can't use view name " . $view->name if $self->exists_view($view->name) || $view->name eq '';
89         $view->schema($self);
90         $self->$orig($view->name, $view);
91         return $self->get_view($view->name);
92     }
93
94     around add_procedure(Procedure $procedure does coerce) {
95         $procedure->schema($self);
96         $self->$orig($procedure->name, $procedure);
97         return $self->get_procedure($procedure->name);
98     }
99
100     around add_trigger(Trigger $trigger does coerce) {
101         $trigger->schema($self);
102         $self->$orig($trigger->name, $trigger);
103         return $self->get_trigger($trigger->name);
104     }
105
106     method is_valid { return $self->get_tables ? 1 : undef }
107
108     around remove_table(Table|Str $table, Int :$cascade = 0) {
109         my $name = is_Table($table) ? $table->name : $table;
110         die "Can't drop non-existant table " . $name unless $self->exists_table($name);
111         $self->$orig($name);
112     }
113
114     around remove_view(View|Str $view) {
115         my $name = is_View($view) ? $view->name : $view;
116         die "Can't drop non-existant view " . $name unless $self->exists_view($name);
117         $self->$orig($name);
118     }
119
120     around remove_trigger(Trigger|Str $trigger) {
121         my $name = is_Trigger($trigger) ? $trigger->name : $trigger;
122 ####        die "Can't drop non-existant trigger " . $name unless $self->exists_trigger($name);
123         $self->$orig($name);
124     }
125
126     around remove_procedure(Procedure|Str $procedure) {
127         my $name = is_Procedure($procedure) ? $procedure->name : $procedure;
128         $self->$orig($name);
129     }
130
131     method order { }
132     method perform_action_when { }
133     method database_events { }
134     method fields { }
135     method on_table { }
136     method action { }
137 }