<?php
/**
 * Copyright © 2024 ExacTI Technology Solutions. All rights reserved.
 * GPLv3 General License.
 * https://exacti.com.br
 * Phacil PHP Framework - https://github.com/exacti/phacil-framework
 */

namespace Phacil\Framework;

/**
 * Factory Class
 *
 * This class provides functionalities for dynamically and flexibly creating instances of other classes.
 *
 * @since 2.0.0
 * @package Phacil\Framework
 * @api
 */
class Factory {
	/**
	 * @var string|null The name of the class to be instantiated by the factory.
	 */
	protected $class;

	/**
	 * 
	 * Factory constructor.
	 *
	 * @param string|null $class (Optional) The name of the class to be instantiated by the factory.
	 *
	 * @return void 
	 */
	public function __construct($class = null) {
		$this->class = $class;
	}

	/**
	 * Sets the name of the class to be instantiated by the factory.
	 *
	 * @param string $class The name of the class.
	 * @return $this 
	 */
	public function setClass($class) {
		$this->class = $class;
		return $this;
	}

	/** 
	 * Gets the name of the class currently configured to be instantiated by the factory.
	 *
	 * @return string  
	 */
	public function getClass() {
		return $this->class;
	}

	/**
	 * Creates an instance of the class configured in the factory.
	 *
	 * @param array $args (Optional) Additional arguments for the class constructor.
	 * @return mixed The created instance.
	 * 
	 * @throws \ReflectionException 
	 * @throws \Phacil\Framework\Exception 
	 * @throws \Exception 
	 */
	public function create(array $args = []) {
		return \Phacil\Framework\Registry::getInstance()->create($this->class, $args);
	}
}