<?php

namespace Doctrine\ODM\MongoDB;

use Doctrine\ODM\MongoDB\Repository\DocumentRepository;
use Doctrine\Persistence\ObjectManager;

class DocumentManager implements ObjectManager
{

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

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

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

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

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

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

}
