<?php

namespace Doctrine\ORM\Decorator;

use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Exception\ORMException;

class EntityManagerDecorator implements EntityManagerInterface
{

	/**
	 * @template T of object
	 * @phpstan-param class-string<T> $entityName
	 * @phpstan-param mixed  $id
	 * @phpstan-param integer|null $lockMode
	 * @phpstan-param integer|null $lockVersion
	 * @phpstan-return T|null
	 * @phpstan-impure
	 */
	public function find($entityName, $id, $lockMode = null, $lockVersion = null);

	/**
	 * @template T of object
	 * @phpstan-param T $entity
	 * @phpstan-return T
	 */
	public function merge($entity);

	/**
	 * @template T of object
	 * @phpstan-param class-string<T> $entityName
	 * @phpstan-return EntityRepository<T>
	 */
	public function getRepository($entityName);

	/**
	 * @template T of object
	 * @phpstan-param class-string<T> $entityName
	 * @phpstan-param mixed $id
	 * @phpstan-return T|null
	 *
	 * @throws ORMException
	 */
	public function getReference($entityName, $id);

	/**
	 * @template T of object
	 * @phpstan-param class-string<T> $entityName
	 * @phpstan-param mixed $identifier
	 *
	 * @phpstan-return T|null
	 */
	public function getPartialReference($entityName, $identifier);

	/**
	 * @template T of object
	 * @phpstan-param T $entity
	 * @phpstan-param bool $deep
	 * @phpstan-return T
	 */
	public function copy($entity, $deep = false);

}
