fix dep, fix doc
[dbsrgits/DBIx-Class-DeploymentHandler.git] / lib / DBIx / Class / DeploymentHandler / DeployMethod / SQL / Translator.pm
index 5f6d7c5..7d5f622 100644 (file)
@@ -1,6 +1,8 @@
 package DBIx::Class::DeploymentHandler::DeployMethod::SQL::Translator;
 use Moose;
 
+# ABSTRACT: Manage your SQL and Perl migrations in nicely laid out directories
+
 use autodie;
 use Carp qw( carp croak );
 
@@ -102,6 +104,10 @@ method __ddl_consume_with_prefix($type, $versions, $prefix) {
   return [@files{sort keys %files}]
 }
 
+method _ddl_preinstall_consume_filenames($type, $version) {
+  $self->__ddl_consume_with_prefix($type, [ $version ], 'preinstall')
+}
+
 method _ddl_schema_consume_filenames($type, $version) {
   $self->__ddl_consume_with_prefix($type, [ $version ], 'schema')
 }
@@ -164,22 +170,21 @@ method _run_sql_and_perl($filenames) {
         $storage->_query_end($line);
       }
     } elsif ( $filename =~ /^(.+)\.pl$/ ) {
-      my $package = $1;
       my $filedata = do { local( @ARGV, $/ ) = $filename; <> };
-      # make the package name more palateable to perl
-      $package =~ s/\W/_/g;
 
       no warnings 'redefine';
-      eval "package $package;\n\n$filedata";
+      my $fn = eval "$filedata";
       use warnings;
 
-      if (my $fn = $package->can('run')) {
-        $fn->($self->schema);
+               if ($@) {
+        carp "$filename failed to compile: $@";
+               } elsif (ref $fn eq 'CODE') {
+        $fn->($self->schema)
       } else {
-        carp "$filename should define a run method that takes a schema but it didn't!";
+        carp "$filename should define an anonymouse sub that takes a schema but it didn't!";
       }
     } else {
-      croak "A file got to deploy that wasn't sql or perl!";
+      croak "A file ($filename) got to deploy that wasn't sql or perl!";
     }
   }
 
@@ -198,6 +203,37 @@ sub deploy {
   ));
 }
 
+sub preinstall_scripts {
+  my $self = shift;
+  my $version = shift || $self->schema_version;
+
+  my @files = @{$self->_ddl_preinstall_consume_filenames(
+    $self->storage->sqlt_type,
+    $version,
+  )};
+
+  for my $filename (@files) {
+    # We ignore sql for now (till I figure out what to do with it)
+    if ( $filename =~ /^(.+)\.pl$/ ) {
+      my $filedata = do { local( @ARGV, $/ ) = $filename; <> };
+
+               no warnings 'redefine';
+      my $fn = eval "$filedata";
+      use warnings;
+
+               if ($@) {
+        carp "$filename failed to compile: $@";
+               } elsif (ref $fn eq 'CODE') {
+        $fn->()
+      } else {
+        carp "$filename should define an anonymous sub but it didn't!";
+      }
+    } else {
+      croak "A file ($filename) got to preinstall_scripts that wasn't sql or perl!";
+    }
+  }
+}
+
 sub _prepare_install {
   my $self      = shift;
   my $sqltargs  = { %{$self->sql_translator_args}, %{shift @_} };
@@ -517,8 +553,8 @@ generic enough to run on all databases.  Good luck with that one.
 
 =head1 PERL SCRIPTS
 
-A perl script for this tool is very simple.  It merely needs to contain a
-sub called C<run> that takes a L<DBIx::Class::Schema> as it's only argument.
+A perl script for this tool is very simple.  It merely needs to contain an
+anonymous sub that takes a L<DBIx::Class::Schema> as it's only argument.
 A very basic perl script might look like:
 
  #!perl
@@ -526,7 +562,7 @@ A very basic perl script might look like:
  use strict;
  use warnings;
 
- sub run {
+ sub {
    my $schema = shift;
 
    $schema->resultset('Users')->create({