add is_deferrable => 1 to belongs_to by default
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader / RelBuilder.pm
index 0a86d60..904e5d1 100644 (file)
@@ -5,6 +5,7 @@ use warnings;
 use Class::C3;
 use Carp::Clan qw/^DBIx::Class/;
 use Lingua::EN::Inflect::Number ();
+use Lingua::EN::Inflect::Phrase ();
 
 our $VERSION = '0.05003';
 
@@ -118,7 +119,7 @@ sub _inflect_plural {
 
 # Singularize a relationship name
 sub _inflect_singular {
-    my ($self, $relname) = @_;
+    my ($self, $relname, $method) = @_;
 
     return '' if !defined $relname || $relname eq '';
 
@@ -131,14 +132,16 @@ sub _inflect_singular {
         return $inflected if $inflected;
     }
 
-    return $self->_to_S($relname);
+    $method ||= '_to_S';
+
+    return $self->$method($relname);
 }
 
 sub _to_PL {
     my ($self, $name) = @_;
 
     $name =~ s/_/ /g;
-    my $plural = Lingua::EN::Inflect::Number::to_PL($name);
+    my $plural = Lingua::EN::Inflect::Phrase::to_PL($name);
     $plural =~ s/ /_/g;
 
     return $plural;
@@ -153,18 +156,47 @@ sub _old_to_PL {
 sub _to_S {
     my ($self, $name) = @_;
 
+    $name =~ s/_/ /g;
+    my $singular = Lingua::EN::Inflect::Phrase::to_S($name);
+    $singular =~ s/ /_/g;
+
+    return $singular;
+}
+
+sub _old_to_S {
+    my ($self, $name) = @_;
+
     return Lingua::EN::Inflect::Number::to_S($name);
 }
 
+sub _default_relationship_attrs { +{
+    has_many => {
+        cascade_delete => 0,
+        cascade_copy   => 0,
+    },
+    might_have => {
+        cascade_delete => 0,
+        cascade_copy   => 0,
+    },
+    belongs_to => {
+        on_delete => 'CASCADE',
+        on_update => 'CASCADE',
+        is_deferrable => 1,
+    },
+} }
+
 # accessor for options to be passed to each generated relationship
 # type.  take single argument, the relationship type name, and returns
 # either a hashref (if some options are set), or nothing
 sub _relationship_attrs {
     my ( $self, $reltype ) = @_;
     my $r = $self->{relationship_attrs};
-    return unless $r && ( $r->{all} || $r->{$reltype} );
 
-    my %composite = %{ $r->{all} || {} };
+    my %composite = (
+        %{ $self->_default_relationship_attrs->{$reltype} || {} },
+        %{ $r->{all} || {} }
+    );
+
     if( my $specific = $r->{$reltype} ) {
        while( my ($k,$v) = each %$specific ) {
            $composite{$k} = $v;
@@ -326,7 +358,7 @@ sub _relnames_and_method {
             grep { _array_eq($_->[1], $local_cols) } @$uniqs) {
         $remote_method = 'might_have';
         $local_relname = $self->_inflect_singular($local_relname_uninflected);
-        $old_local_relname = $self->_inflect_singular($old_local_relname_uninflected);
+        $old_local_relname = $self->_inflect_singular($old_local_relname_uninflected, '_old_to_S');
     }
 
     warn __PACKAGE__." $VERSION: renaming ${remote_class} relation '$old_local_relname' to '$local_relname'.  This behavior is new as of 0.05003.\n" if $old_local_relname && $local_relname ne $old_local_relname;