. */ namespace SP\Mgmt; use SP\Core\DiFactory; use SP\Core\Exceptions\InvalidClassException; use SP\Core\Exceptions\SPException; use SP\DataModel\DataModelInterface; /** * Class ItemBase * * @package SP\Mgmt */ abstract class ItemBase { /** * @var string */ protected $dataModel; /** * @var mixed|DataModelInterface */ protected $itemData; /** * Constructor. * * @param null $itemData * @throws InvalidClassException */ public function __construct($itemData = null) { if (null !== $itemData) { $this->setItemData($itemData); } else { $this->itemData = new $this->dataModel(); } } /** * Devolver la instancia almacenada de la clase. Si no existe, se crea * * @param $itemData * @return static */ public final static function getItem($itemData = null) { return DiFactory::getItem(get_called_class(), $itemData); } /** * Devolver una nueva instancia de la clase * * @param null $itemData * @return static * @throws \SP\Core\Exceptions\InvalidClassException */ public static final function getNewItem($itemData = null) { return new static($itemData); } /** * Devolver los datos del elemento * * @return mixed|DataModelInterface */ public function getItemData() { return is_object($this->itemData) ? $this->itemData : new $this->dataModel(); } /** * @param $itemData * @return $this * @throws InvalidClassException */ public final function setItemData($itemData) { if (null !== $this->dataModel && !$itemData instanceof $this->dataModel) { throw new InvalidClassException(SPException::SP_ERROR, $this->dataModel); } $this->itemData = $itemData; return $this; } /** * @return string */ public function getDataModel() { return $this->dataModel; } /** * @param string $dataModel * @return $this * @throws InvalidClassException */ protected final function setDataModel($dataModel) { if (false === class_exists($dataModel)) { throw new InvalidClassException($dataModel); } $this->dataModel = $dataModel; return $this; } }