DBIx-Class-Schema-Loader

 view release on metacpan or  search on metacpan

lib/DBIx/Class/Schema/Loader/RelBuilder.pm  view on Meta::CPAN

            $result = $inflected;
            $mapped = 1;
        }
    }

    return ($result, $mapped) if $mapped;

    return ($self->_to_PL($relname), 0);
}

# Singularize a relationship name
sub _inflect_singular {
    my ($self, $relname) = @_;

    return '' if !defined $relname || $relname eq '';

    my $result;
    my $mapped = 0;

    if( ref $self->inflect_singular eq 'HASH' ) {
        if (exists $self->inflect_singular->{$relname}) {
            $result = $self->inflect_singular->{$relname};
            $mapped = 1;
        }
    }
    elsif( ref $self->inflect_singular eq 'CODE' ) {
        my $inflected = $self->inflect_singular->($relname);
        if ($inflected) {
            $result = $inflected;
            $mapped = 1;
        }
    }

    return ($result, $mapped) if $mapped;

    return ($self->_to_S($relname), 0);
}

sub _to_PL {
    my ($self, $name) = @_;

    $name =~ s/_/ /g;
    my $plural = Lingua::EN::Inflect::Phrase::to_PL($name);
    $plural =~ s/ /_/g;

    return $plural;
}

sub _to_S {
    my ($self, $name) = @_;

    $name =~ s/_/ /g;
    my $singular = Lingua::EN::Inflect::Phrase::to_S($name);
    $singular =~ s/ /_/g;

    return $singular;
}

sub _default_relationship_attrs { +{
    has_many => {
        cascade_delete => 0,
        cascade_copy   => 0,
    },
    might_have => {
        cascade_delete => 0,
        cascade_copy   => 0,
    },
    belongs_to => {
        on_delete => 'CASCADE',
        on_update => 'CASCADE',
        is_deferrable => 1,
    },
} }

# Accessor for options to be passed to each generated relationship type. takes
# the relationship type name and optionally any attributes from the database
# (such as FK ON DELETE/UPDATE and DEFERRABLE clauses), and returns a
# hashref or undef if nothing is set.
#
# The attributes from the database override the default attributes, which in
# turn are overridden by user supplied attributes.
sub _relationship_attrs {
    my ( $self, $reltype, $db_attrs, $params ) = @_;
    my $r = $self->relationship_attrs;

    my %composite = (
        %{ $self->_default_relationship_attrs->{$reltype} || {} },
        %{ $db_attrs || {} },
        (
            ref $r eq 'HASH' ? (
                %{ $r->{all} || {} },
                %{ $r->{$reltype} || {} },
            )
            :
            ()
        ),
    );

    if (ref $r eq 'CODE') {
        $params->{attrs} = \%composite;

        my %ret = %{ $r->(%$params) || {} };

        %composite = %ret if %ret;
    }

    return %composite ? \%composite : undef;
}

sub _strip_id_postfix {
    my ($self, $name) = @_;

    $name =~ s/_?(?:id|ref|cd|code|num)\z//i;

    return $name;
}

sub _remote_attrs {
    my ($self, $local_moniker, $local_cols, $fk_attrs, $params) = @_;

    # get our set of attrs from _relationship_attrs, which uses the FK attrs if available
    my $attrs = $self->_relationship_attrs('belongs_to', $fk_attrs, $params) || {};

    # If any referring column is nullable, make 'belongs_to' an
    # outer join, unless explicitly set by relationship_attrs
    my $nullable = first { $self->schema->source($local_moniker)->column_info($_)->{is_nullable} } @$local_cols;



( run in 0.695 second using v1.01-cache-2.11-cpan-39bf76dae61 )