1 package # hide from PAUSE
2 DBIx::Class::Relationship::ManyToMany;
8 my ($class, $meth, $rel, $f_rel, $rel_attrs) = @_;
11 no warnings 'redefine';
13 my $remove_link_meth = "remove_from_$rel";
14 my $add_link_meth = "add_to_$rel";
16 *{"${class}::${meth}"} = sub {
18 my $attrs = @_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {};
19 $self->search_related($rel)->search_related(
20 $f_rel, @_ > 0 ? @_ : undef, { %{$rel_attrs||{}}, %$attrs }
24 *{"${class}::add_to_${meth}"} = sub {
26 @_ > 0 or $self->throw_exception(
27 "$add_link_meth needs an object or hashref"
29 my $source = $self->result_source;
30 my $schema = $source->schema;
31 my $rel_source_name = $source->relationship_info($rel)->{source};
32 my $rel_source = $schema->resultset($rel_source_name)->result_source;
33 my $f_rel_source_name = $rel_source->relationship_info($f_rel)->{source};
34 my $f_rel_rs = $schema->resultset($f_rel_source_name);
36 ? ( ref $_[0] eq 'HASH' ? $f_rel_rs->create($_[0]) : $_[0] )
37 : ( $f_rel_rs->create({@_}) );
38 my $link = $self->search_related($rel)->new_result({});
39 $link->set_from_related($f_rel, $obj);
43 *{"${class}::remove_from_${meth}"} = sub {
45 @_ > 0 && ref $_[0] ne 'HASH'
46 or $self->throw_exception("$remove_link_meth needs an object");
48 my $rel_source = $self->search_related($rel)->result_source;
49 my $cond = $rel_source->relationship_info($f_rel)->{cond};
50 my $link_cond = $rel_source->resolve_condition(
53 $self->search_related($rel, $link_cond)->delete;