From: Dagfinn Ilmari Mannsåker Date: Sun, 19 Apr 2009 12:35:33 +0000 (+0000) Subject: Factor out 0.04 incompatibilities to separate methods X-Git-Tag: 0.04999_08~23 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c39e403eb77720d9ca58e60c321d880e7a163b4d;p=dbsrgits%2FDBIx-Class-Schema-Loader.git Factor out 0.04 incompatibilities to separate methods This way they can be overridden by a back-compat subclass --- diff --git a/lib/DBIx/Class/Schema/Loader/Base.pm b/lib/DBIx/Class/Schema/Loader/Base.pm index 9bc5673..f674dcd 100644 --- a/lib/DBIx/Class/Schema/Loader/Base.pm +++ b/lib/DBIx/Class/Schema/Loader/Base.pm @@ -725,6 +725,13 @@ sub tables { } # Make a moniker from a table +sub _default_table2moniker { + my ($self, $table) = @_; + + return join '', map ucfirst, split /[\W_]+/, + Lingua::EN::Inflect::Number::to_S(lc $table); +} + sub _table2moniker { my ( $self, $table ) = @_; @@ -737,8 +744,7 @@ sub _table2moniker { $moniker = $self->moniker_map->($table); } - $moniker ||= join '', map ucfirst, split /[\W_]+/, - Lingua::EN::Inflect::Number::to_S(lc $table); + $moniker ||= $self->_default_table2moniker($table); return $moniker; } diff --git a/lib/DBIx/Class/Schema/Loader/RelBuilder.pm b/lib/DBIx/Class/Schema/Loader/RelBuilder.pm index 0f1c413..59a5638 100644 --- a/lib/DBIx/Class/Schema/Loader/RelBuilder.pm +++ b/lib/DBIx/Class/Schema/Loader/RelBuilder.pm @@ -132,6 +132,32 @@ sub _array_eq { return 1; } +sub _uniq_fk_rel { + my ($self, $local_moniker, $local_relname, $local_cols, $uniqs) = @_; + + my $remote_method = 'has_many'; + + # If the local columns have a UNIQUE constraint, this is a one-to-one rel + my $local_source = $self->{schema}->source($local_moniker); + if (_array_eq([ $local_source->primary_columns ], $local_cols) || + grep { _array_eq($_->[1], $local_cols) } @$uniqs) { + $remote_method = 'might_have'; + $local_relname = $self->_inflect_singular($local_relname); + } + + return ($remote_method, $local_relname); +} + +sub _remote_attrs { + my ($self, $local_moniker, $local_cols) = @_; + + # If the referring column is nullable, make 'belongs_to' an outer join: + my $nullable = grep { $self->{schema}->source($local_moniker)->column_info($_)->{is_nullable} } + @$local_cols; + + return $nullable ? { join_type => 'LEFT' } : (); +} + sub generate_code { my ($self, $local_moniker, $rels, $uniqs) = @_; @@ -199,26 +225,16 @@ sub generate_code { delete $rev_cond{$_}; } - my $remote_method = 'has_many'; - - # If the local columns have a UNIQUE constraint, this is a one-to-one rel - my $local_source = $self->{schema}->source($local_moniker); - if (_array_eq([ $local_source->primary_columns ], $local_cols) || - grep { _array_eq($_->[1], $local_cols) } @$uniqs) { - $remote_method = 'might_have'; - $local_relname = $self->_inflect_singular($local_relname); - } + my ($remote_method); - # If the referring column is nullable, make 'belongs_to' an outer join: - my $nullable = grep { $local_source->column_info($_)->{is_nullable} } - @$local_cols; + ($remote_method, $local_relname) = $self->_uniq_fk_rel($local_moniker, $local_relname, $local_cols, $uniqs); push(@{$all_code->{$local_class}}, { method => 'belongs_to', args => [ $remote_relname, $remote_class, \%cond, - $nullable ? { join_type => 'LEFT' } : () + $self->_remote_attrs($local_moniker, $local_cols), ], } );