Introduce GOVERNANCE document and empty RESOLUTIONS file.
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Relationship / HasMany.pm
1 package # hide from PAUSE
2     DBIx::Class::Relationship::HasMany;
3
4 use strict;
5 use warnings;
6 use DBIx::Class::_Util 'dbic_internal_try';
7 use namespace::clean;
8
9 our %_pod_inherit_config =
10   (
11    class_map => { 'DBIx::Class::Relationship::HasMany' => 'DBIx::Class::Relationship' }
12   );
13
14 sub has_many {
15   my ($class, $rel, $f_class, $cond, $attrs) = @_;
16
17   unless (ref $cond) {
18
19     my $pri = $class->result_source->_single_pri_col_or_die;
20
21     my ($f_key,$guess);
22     if (defined $cond && length $cond) {
23       $f_key = $cond;
24       $guess = "caller specified foreign key '$f_key'";
25     } else {
26       $class =~ /([^\:]+)$/;  # match is safe - $class can't be ''
27       $f_key = lc $1; # go ahead and guess; best we can do
28       $guess = "using our class name '$class' as foreign key source";
29     }
30
31 # FIXME - this check needs to be moved to schema-composition time...
32 #    # only perform checks if the far side appears already loaded
33 #    if (my $f_rsrc = dbic_internal_try { $f_class->result_source } ) {
34 #      $class->throw_exception(
35 #        "No such column '$f_key' on foreign class ${f_class} ($guess)"
36 #      ) if !$f_rsrc->has_column($f_key);
37 #    }
38
39     $cond = { "foreign.${f_key}" => "self.${pri}" };
40   }
41
42   my $default_cascade = ref $cond eq 'CODE' ? 0 : 1;
43
44   $class->add_relationship($rel, $f_class, $cond, {
45     accessor => 'multi',
46     join_type => 'LEFT',
47     cascade_delete => $default_cascade,
48     cascade_copy => $default_cascade,
49     is_depends_on => 0,
50     %{$attrs||{}}
51   });
52 }
53
54 1;