finish preserve_case support
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader / Base.pm
index 8ec3e7f..1c49a0d 100644 (file)
@@ -20,6 +20,7 @@ use Class::Inspector ();
 use Data::Dumper::Concise;
 use Scalar::Util 'looks_like_number';
 use File::Slurp 'slurp';
+use DBIx::Class::Schema::Loader::Utils 'split_name';
 require DBIx::Class;
 
 our $VERSION = '0.07000';
@@ -851,8 +852,8 @@ sub _load_external {
     }
 
     if ($old_real_inc_path) {
-        open(my $fh, '<', $old_real_inc_path)
-            or croak "Failed to open '$old_real_inc_path' for reading: $!";
+        my $code = slurp $old_real_inc_path;
+
         $self->_ext_stmt($class, <<"EOF");
 
 # These lines were loaded from '$old_real_inc_path',
@@ -861,7 +862,6 @@ sub _load_external {
 # upgrade. See skip_load_external to disable this feature.
 EOF
 
-        my $code = slurp $old_real_inc_path;
         $code = $self->_rewrite_old_classnames($code);
 
         if ($self->dynamic) {
@@ -909,14 +909,11 @@ sub load {
 
 Arguments: schema
 
-Rescan the database for newly added tables.  Does
-not process drops or changes.  Returns a list of
-the newly added table monikers.
+Rescan the database for changes. Returns a list of the newly added table
+monikers.
 
-The schema argument should be the schema class
-or object to be affected.  It should probably
-be derived from the original schema_class used
-during L</load>.
+The schema argument should be the schema class or object to be affected.  It
+should probably be derived from the original schema_class used during L</load>.
 
 =cut
 
@@ -943,9 +940,12 @@ sub rescan {
         }
     }
 
-    my $loaded = $self->_load_tables(@created);
+    delete $self->{_dump_storage};
+    delete $self->{_relations_started};
 
-    return map { $self->monikers->{$_} } @$loaded;
+    my $loaded = $self->_load_tables(@current);
+
+    return map { $self->monikers->{$_} } @created;
 }
 
 sub _relbuilder {
@@ -1482,7 +1482,7 @@ sub _resolve_col_accessor_collisions {
 sub _make_column_accessor_name {
     my ($self, $column_name) = @_;
 
-    return join '_', map lc, split /(?<=[[:lower:]])[\W_]*(?=[[:upper:]])|[\W_]+/, $column_name;
+    return join '_', map lc, split_name $column_name;
 }
 
 # Set up metadata (cols, pks, etc)
@@ -1506,14 +1506,21 @@ sub _setup_src_meta {
 
     my $cols = $self->_table_columns($table);
     my $col_info = $self->__columns_info_for($table);
+
+    while (my ($col, $info) = each %$col_info) {
+        if ($col =~ /\W/) {
+            ($info->{accessor} = $col) =~ s/\W+/_/g;
+        }
+    }
+
     if ($self->preserve_case) {
-        for my $col (keys %$col_info) {
+        while (my ($col, $info) = each %$col_info) {
             if ($col ne lc($col)) {
                 if ((not exists $self->naming->{column_accessors}) || (($self->naming->{column_accessors} =~ /(\d+)/)[0] >= 7)) {
-                    $col_info->{$col}{accessor} = $self->_make_column_accessor_name($col);
+                    $info->{accessor} = $self->_make_column_accessor_name($info->{accessor} || $col);
                 }
                 else {
-                    $col_info->{$col}{accessor} = lc $col;
+                    $info->{accessor} = lc($info->{accessor} || $col);
                 }
             }
         }
@@ -1601,7 +1608,7 @@ sub _default_table2moniker {
         return join '', map ucfirst, split /\W+/, $inflected;
     }
 
-    my @words = map lc, split /(?<=[[:lower:]])[\W_]*(?=[[:upper:]])|[\W_]+/, $table;
+    my @words = map lc, split_name $table;
     my $as_phrase = join ' ', @words;
 
     my $inflected = Lingua::EN::Inflect::Phrase::to_S($as_phrase);