Move scary stuff to its own class
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / HasOne.pm
index fd8be7e..f9046ca 100644 (file)
@@ -3,10 +3,11 @@ package # hide from PAUSE
 
 use strict;
 use warnings;
-use Carp::Clan qw/^DBIx::Class/;
+use DBIx::Class::Carp;
 use Try::Tiny;
+use namespace::clean;
 
-our %_pod_inherit_config = 
+our %_pod_inherit_config =
   (
    class_map => { 'DBIx::Class::Relationship::HasOne' => 'DBIx::Class::Relationship' }
   );
@@ -31,7 +32,7 @@ sub _has_one {
       "${class} has none"
     ) if !defined $pri && (!defined $cond || !length $cond);
 
-    my $f_class_loaded = eval { $f_class->columns };
+    my $f_class_loaded = try { $f_class->columns };
     my ($f_key,$too_many,$guess);
     if (defined $cond && length $cond) {
       $f_key = $cond;
@@ -49,10 +50,14 @@ sub _has_one {
     $cond = { "foreign.${f_key}" => "self.${pri}" };
   }
   $class->_validate_has_one_condition($cond);
+
+  my $default_cascade = ref $cond eq 'CODE' ? 0 : 1;
+
   $class->add_relationship($rel, $f_class,
    $cond,
    { accessor => 'single',
-     cascade_update => 1, cascade_delete => 1,
+     cascade_update => $default_cascade,
+     cascade_delete => $default_cascade,
      ($join_type ? ('join_type' => $join_type) : ()),
      %{$attrs || {}} });
   1;
@@ -63,7 +68,7 @@ sub _get_primary_key {
   $target_class ||= $class;
   my ($pri, $too_many) = try { $target_class->_pri_cols }
     catch {
-      $class->throw_exception("Can't infer join condition on ${target_class}: $@");
+      $class->throw_exception("Can't infer join condition on ${target_class}: $_");
     };
 
   $class->throw_exception(