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 / 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 SQL::Translator::Types qw(Procedure Table Trigger View);
5     use MooseX::MultiMethods;
6  
7     has 'name' => (
8         is => 'rw',
9         isa => Maybe[Str],
10         required => 1,
11         default => ''
12     );
13
14     has 'database' => (
15         is => 'rw',
16         isa => Maybe[Str],
17     );
18     
19     has 'tables' => (
20         traits => ['Hash'],
21         is => 'rw',
22         isa => HashRef[Table],
23         handles => {
24             exists_table => 'exists',
25             table_ids    => 'keys',
26             get_tables   => 'values',
27             get_table    => 'get',
28             add_table    => 'set',
29             remove_table => 'delete',
30         },
31         default => sub { my %hash = (); tie %hash, 'Tie::IxHash'; return \%hash },
32     );
33     
34     has 'views' => (
35         traits => ['Hash'],
36         is => 'rw',
37         isa => HashRef[View],
38         handles => {
39             exists_view => 'exists',
40             view_ids    => 'keys',
41             get_views   => 'values',
42             get_view    => 'get',
43             add_view    => 'set',
44         },
45         default => sub { my %hash = (); tie %hash, 'Tie::IxHash'; return \%hash },
46     );
47     
48     has 'procedures' => (
49         traits => ['Hash'],
50         is => 'rw',
51         isa => HashRef[Procedure],
52         handles => {
53             exists_procedure => 'exists',
54             procedure_ids    => 'keys',
55             get_procedures   => 'values',
56             get_procedure    => 'get',
57             add_procedure    => 'set',
58         },
59         default => sub { my %hash = (); tie %hash, 'Tie::IxHash'; return \%hash },
60     );
61
62     has 'triggers' => (
63         traits => ['Hash'],
64         is => 'rw',
65         isa => HashRef[Trigger],
66         handles => {
67             exists_trigger => 'exists',
68             trigger_ids    => 'keys',
69             get_triggers   => 'values',
70             get_trigger    => 'get',
71             add_trigger    => 'set',
72         },
73         default => sub { my %hash = (); tie %hash, 'Tie::IxHash'; return \%hash },
74     );
75
76     around add_table(Table $table does coerce) {
77         die "Can't use table name " . $table->name if $self->exists_table($table->name) || $table->name eq '';
78         $table->schema($self);
79         $self->$orig($table->name, $table);
80     }
81
82     around add_view(View $view does coerce) { $self->$orig($view->name, $view) }
83     around add_procedure(Procedure $procedure does coerce) { $self->$orig($procedure->name, $procedure) }
84     around add_trigger(Trigger $trigger does coerce) { $self->$orig($trigger->name, $trigger) }
85
86     method is_valid { return $self->get_tables ? 1 : undef }
87
88     around remove_table(Table|Str $table, Int :$cascade = 0) {
89         my $name = is_Table($table) ? $table->name : $table;
90         die "Can't drop non-existant table " . $name unless $self->exists_table($name);
91         $self->$orig($name);
92     }
93
94     method order { }
95     method perform_action_when { }
96     method database_events { }
97     method fields { }
98     method on_table { }
99     method action { }
100 }