<?php

#namespace Doctrine::ORM::Mapping;

/**
 * A many-to-many mapping describes the mapping between two collections of
 * entities.
 *
 * @since 2.0
 * @todo Rename to ManyToManyMapping
 */
class Doctrine_ORM_Mapping_ManyToManyMapping extends Doctrine_ORM_Mapping_AssociationMapping
{    
    /**
     * The name of the association class (if an association class is used).
     *
     * @var string
     */
    private $_associationClass;
    
    /** The field in the source table that corresponds to the key in the relation table */
    protected $_sourceKeyColumns;

    /**  The field in the target table that corresponds to the key in the relation table */
    protected $_targetKeyColumns;

    /** The field in the intermediate table that corresponds to the key in the source table */
    protected $_sourceRelationKeyColumns;

    /** The field in the intermediate table that corresponds to the key in the target table */
    protected $_targetRelationKeyColumns;
    
    /**
     * Constructor.
     * Creates a new ManyToManyMapping.
     *
     * @param array $mapping  The mapping info.
     */
    public function __construct(array $mapping)
    {
        parent::__construct($mapping);
    }
    
    /**
     * Validates and completes the mapping.
     *
     * @param array $mapping
     * @override
     */
    protected function _validateAndCompleteMapping(array $mapping)
    {
        parent::_validateAndCompleteMapping($mapping);
        
        if ($this->isOwningSide()) {
            // many-many owning MUST have a join table
            if ( ! isset($mapping['joinTable'])) {
                throw Doctrine_MappingException::joinTableRequired($mapping['fieldName']);
            }
        
            // optional attributes for many-many owning side
            $this->_associationClass = isset($mapping['associationClass']) ?
                    $mapping['associationClass'] : null;
        }
    }
    
    /**
     * Whether the mapping uses an association class for the intermediary
     * table.
     *
     * @return boolean
     */
    public function usesAssociationClass()
    {
        return $this->_associationClass !== null;
    }
    
    /**
     * Gets the name of the association class.
     *
     * @return string
     */
    public function getAssociationClassName()
    {
        return $this->_associationClass;
    }
}

?>