X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FTranslator.pm;h=567c005170910e76a8efc2160affa95a0dec970a;hb=cac60624dd22a5adef500421c965f89d81586538;hp=78a0041ca5363c9ad1c0702d25f630441232c9b2;hpb=c50513510a3498997d753b0e9c1fe36955e5528b;p=dbsrgits%2FSQL-Translator-2.0-ish.git diff --git a/lib/SQL/Translator.pm b/lib/SQL/Translator.pm index 78a0041..567c005 100644 --- a/lib/SQL/Translator.pm +++ b/lib/SQL/Translator.pm @@ -1,3 +1,76 @@ -package SQL::Translator; - -1; +use MooseX::Declare; +class SQL::Translator { + use MooseX::Types::Moose qw(Str); + use TryCatch; + use SQL::Translator::Types qw(DBIHandle Parser Producer); + + has 'parser' => ( + isa => Str, + is => 'ro', + init_arg => 'from', + required => 1, + ); + + has 'producer' => ( + isa => Str, + is => 'ro', + init_arg => 'to', + required => 1, + ); + + has '_parser' => ( + isa => Parser, + is => 'rw', + lazy_build => 1, + handles => [ qw(parse) ], + ); + + has '_producer' => ( + isa => Producer, + is => 'rw', + lazy_build => 1, + handles => [ qw(produce) ], + ); + + has 'dbh' => ( + isa => DBIHandle, + is => 'ro', + predicate => 'has_dbh', + ); + + has 'filename' => ( + isa => Str, + is => 'ro', + predicate => 'has_ddl', + ); + + method _build__parser { + my $class = 'SQL::Translator::Parser'; + + Class::MOP::load_class($class); + + my $parser; + if ($self->has_dbh) { + $parser = $class->new({ dbh => $self->dbh }); + } elsif ($self->has_ddl) { + $parser = $class->new({ filename => $self->filename, type => $self->parser }); + } else { + die "dbh or filename is required!"; + } + + return $parser; + } + + method _build__producer { + my $class = 'SQL::Translator::Producer'; + my $role = $class . '::' . $self->producer; + + Class::MOP::load_class($class); + try { Class::MOP::load_class($role) } catch ($e) { $role = $class . '::SQL::' . $self->producer; Class::MOP::load_class($role) } + + my $producer = $class->new({ schema => $self->parse }); + $role->meta->apply($producer); + + return $producer; + } +}