Oryx

 view release on metacpan or  search on metacpan

lib/Oryx/Association.pm  view on Meta::CPAN

an associtation.

=cut

sub class {
    my $self = shift;
    unless (defined $self->{class}) {
	$self->{class} = $self->getMetaAttribute("class");
    }
    $self->{class};
}

=item role

Simple accessor to the association accessor name defined in the
source class. Defaults to the target class' table name.

=cut

sub role {
    my $self = shift;
    unless (defined $self->{role}) {
        $self->{role} = $self->getMetaAttribute("role");
	unless ($self->{role}) {
	    # set some sensible defaults for creating the accessor
	    $self->{role} = $self->class->table;
	}
    }
    $self->{role};
}

=item type

Reference, Array or Hash... defaults to Reference.

=cut

sub type {
    my $self = shift;
    unless (defined $self->{type}) {
	$self->{type} = $self->getMetaAttribute("type")
	  || 'Reference';
    }
    $self->{type};
}

=item is_weak

Simple accessor to the C<is_weak> meta-attribute. This is used
for stopping Reference association types from creating a column
in the target class for storing a reverse association.

=cut

sub is_weak { $_[0]->getMetaAttribute('is_weak') }

=item constraint

Simple accessor to the C<constraint> meta-attribute. Values are:
Aggregate or Composition ... Aggregate is the default,
Composition causes deletes to cascade.

=cut

sub constraint {
    my $self = shift;
    unless (defined $self->{constraint}) {
	$self->{constraint} = $self->getMetaAttribute("constraint")
	  || 'Aggregate';
    }
    $self->{constraint};
}

=item update_backrefs

Updates reverse Reference associations.

B<NOTE:> Currently, reverse associations are made up of two
unidirectional associations... link tables are therefore not shared.
This will be fixed.

=cut

sub update_backrefs {
    my ($self, $obj, @things) = @_;
    foreach my $rev_assoc (values %{$self->class->associations}) {
	unless ($rev_assoc->type eq 'Reference') {
	    $self->_carp(
	        'weak associations not supported for non-Reference types'
	    );
	    next;
	}
	if ($rev_assoc->class eq $self->source) {
	    my $backref = $rev_assoc->role;
	    foreach my $target (@things) {
		$target->$backref($obj);
		$target->update unless $rev_assoc->is_weak;
	    }
	}
    }
}

=item link_table

Returns a name for the link table for this association. Not relevant
for Reference associations as these don't require a link table.

This is just a shortcut for:

     $self->source->table.'_'.$self->role.'_'.$self->class->table

Override for custom association types as needed.

=cut

sub link_table {
    my $self = shift;
    return $self->source->table.'_'.$self->role.'_'.$self->class->table;
}

1;



( run in 0.529 second using v1.01-cache-2.11-cpan-5a3173703d6 )