<?php

namespace Doctrine\ORM\Mapping;

use BackedEnum;
use Doctrine\Persistence\Mapping\ClassMetadata;
use ReflectionClass;

/**
 * @template-covariant T of object
 * @template-implements ClassMetadata<T>
 * @psalm-type FieldMapping = array{
 *      type: string,
 *      fieldName: string,
 *      columnName: string,
 *      length?: int,
 *      id?: bool,
 *      nullable?: bool,
 *      notInsertable?: bool,
 *      notUpdatable?: bool,
 *      generated?: int,
 *      enumType?: class-string<BackedEnum>,
 *      columnDefinition?: string,
 *      precision?: int,
 *      scale?: int,
 *      unique?: string,
 *      inherited?: class-string,
 *      originalClass?: class-string,
 *      originalField?: string,
 *      quoted?: bool,
 *      requireSQLConversion?: bool,
 *      declared?: class-string,
 *      declaredField?: string,
 *      options?: array<string, mixed>
 * }
 * @psalm-type JoinColumnData = array{
 *     name: string,
 *     referencedColumnName: string,
 *     unique?: bool,
 *     quoted?: bool,
 *     fieldName?: string,
 *     onDelete?: string,
 *     columnDefinition?: string,
 *     nullable?: bool,
 * }
 * @psalm-type AssociationMapping = array{
 *     cache?: array,
 *     cascade: array<string>,
 *     declared?: class-string,
 *     fetch: mixed,
 *     fieldName: string,
 *     id?: bool,
 *     inherited?: class-string,
 *     indexBy?: string,
 *     inversedBy: string|null,
 *     isCascadeRemove: bool,
 *     isCascadePersist: bool,
 *     isCascadeRefresh: bool,
 *     isCascadeMerge: bool,
 *     isCascadeDetach: bool,
 *     isOnDeleteCascade?: bool,
 *     isOwningSide: bool,
 *     joinColumns?: array<JoinColumnData>,
 *     joinColumnFieldNames?: array<string, string>,
 *     joinTable?: array,
 *     joinTableColumns?: list<mixed>,
 *     mappedBy: string|null,
 *     orderBy?: array,
 *     originalClass?: class-string,
 *     originalField?: string,
 *     orphanRemoval?: bool,
 *     relationToSourceKeyColumns?: array,
 *     relationToTargetKeyColumns?: array,
 *     sourceEntity: class-string,
 *     sourceToTargetKeyColumns?: array<string, string>,
 *     targetEntity: class-string,
 *     targetToSourceKeyColumns?: array<string, string>,
 *     type: int,
 *     unique?: bool,
 * }
 * @psalm-type DiscriminatorColumnMapping = array{
 *     name: string,
 *     fieldName: string,
 *     type: string,
 *     length?: int,
 *     columnDefinition?: string|null,
 *     enumType?: class-string<BackedEnum>|null,
 * }
 */
class ClassMetadataInfo implements ClassMetadata
{

	/** @var string|null */
	public $customRepositoryClassName;

	/**
     * @param class-string<T> $entityName
     */
    public function __construct($entityName)
    {

    }

    /**
	 * @param string $assocName
	 * @return class-string
	 */
	public function getAssociationTargetClass($assocName);

    /**
	 * @return T
	 */
	public function newInstance()
	{

	}

	/**
	 * @return class-string<T>
	 */
	public function getName();

	/**
	 * @return ReflectionClass<T>
	 */
	public function getReflectionClass();

}
