use mro 'c3';
use Carp::Clan qw/^DBIx::Class/;
use Scalar::Util 'weaken';
-use DBIx::Class::Schema::Loader::Utils qw/split_name slurp_file array_eq/;
+use DBIx::Class::Schema::Loader::Utils qw/split_name slurp_file array_eq apply uniq/;
use Try::Tiny;
-use List::Util 'first';
-use List::MoreUtils qw/apply uniq any/;
+use List::Util qw/all any first/;
use namespace::clean;
use Lingua::EN::Inflect::Phrase ();
use Lingua::EN::Tagger ();
use Class::Unload ();
use Class::Inspector ();
-our $VERSION = '0.07040';
+our $VERSION = '0.07043';
# Glossary:
#
class names. The values are arrayrefs of hashes containing method name and
arguments, like so:
- {
- 'Some::Source::Class' => [
- { method => 'belongs_to', arguments => [ 'col1', 'Another::Source::Class' ],
- { method => 'has_many', arguments => [ 'anothers', 'Yet::Another::Source::Class', 'col15' ],
- ],
- 'Another::Source::Class' => [
- # ...
- ],
- # ...
- }
+ {
+ 'Some::Source::Class' => [
+ { method => 'belongs_to', arguments => [
+ 'col1', 'Another::Source::Class' ] },
+ { method => 'has_many', arguments => [
+ 'anothers', 'Yet::Another::Source::Class', 'col15' ] },
+ ],
+ 'Another::Source::Class' => [
+ # ...
+ ],
+ # ...
+ }
=cut
relationship_attrs
rel_collision_map
rel_name_map
+ allow_extra_m2m_cols
_temp_classes
__tagger
/);
my $self = {
loader => $loader,
- schema => $loader->schema,
- inflect_plural => $loader->inflect_plural,
- inflect_singular => $loader->inflect_singular,
- relationship_attrs => $loader->relationship_attrs,
- rel_collision_map => $loader->rel_collision_map,
- rel_name_map => $loader->rel_name_map,
+ (map { $_ => $loader->$_ } qw(
+ schema inflect_plural inflect_singular
+ relationship_attrs rel_collision_map
+ rel_name_map allow_extra_m2m_cols
+ )),
_temp_classes => [],
};
$class{class} = $rels[$this]{args}[1];
+ my %link_cols = map { $_ => 1 } apply { s/^self\.//i } values %{ $rels[$this]{args}[2] };
+
$class{link_table_rel} = first {
- $_->{method} eq 'has_many' && $_->{args}[1] eq $link_class
+ $_->{method} eq 'has_many'
+ and
+ $_->{args}[1] eq $link_class
+ and
+ all { $link_cols{$_} } apply { s/^foreign\.//i } keys %{$_->{args}[2]}
} @{ $all_code->{$class{class}} };
next LINK_CLASS unless $class{link_table_rel};
} ];
$class{to_cols} = [ apply { s/^foreign\.//i } keys %{ $rels[$that]{args}[2] } ];
+
+ $class{from_link_cols} = [ apply { s/^self\.//i } values %{ $rels[$this]{args}[2] } ];
}
my $link_moniker = $rels[0]{extra}{local_moniker};
my @link_table_primary_cols =
@{[ $self->schema->source($link_moniker)->primary_columns ]};
- next unless @{$class[0]{to_cols}} + @{$class[1]{to_cols}} == @link_table_cols
- && @link_table_cols == @link_table_primary_cols;
+ next unless array_eq(
+ [ sort +uniq @{$class[0]{from_link_cols}}, @{$class[1]{from_link_cols}} ],
+ [ sort @link_table_primary_cols ],
+ ) && ($self->allow_extra_m2m_cols || @link_table_cols == @link_table_primary_cols);
foreach my $this (0, 1) {
my $that = $this ? 0 : 1;
$self->_temp_classes([]);
}
-=head1 AUTHOR
+=head1 AUTHORS
-See L<DBIx::Class::Schema::Loader/AUTHOR> and L<DBIx::Class::Schema::Loader/CONTRIBUTORS>.
+See L<DBIx::Class::Schema::Loader/AUTHORS>.
=head1 LICENSE