add beforeClone and afterClone

This commit is contained in:
2026-03-21 12:37:28 -04:00
parent 1c1eae0ea3
commit 57c5adbf78
3 changed files with 25 additions and 4 deletions

View File

@@ -1,7 +1,7 @@
{
"name": "potter/cloneable",
"description": "Potter Framework Cloneable Interface",
"version": "1.0.0",
"version": "1.0.1",
"type": "library",
"homepage": "https://gitpotter.com/Potter/Cloneable",
"license": "MIT",
@@ -19,6 +19,8 @@
},
"minimum-stability": "stable",
"require": {
"php": "^8.3"
"php": "^8.3",
"potter/event": "^1.0",
"league/event": "^3.0"
}
}

View File

@@ -4,7 +4,9 @@ declare(strict_types=1);
namespace Potter\Cloneable;
interface CloneableInterface
use \Potter\Event\DispatcherAwareInterface;
interface CloneableInterface extends DispatcherAwareInterface
{
public function clone(): static;
public function __clone(): void;

View File

@@ -4,13 +4,30 @@ declare(strict_types=1);
namespace Potter\Cloneable;
use \League\Event\EventDispatcher as BaseDispatcher;
trait CloneableTrait
{
private const string BEFORE_CLONE = 'beforeClone';
private const string AFTER_CLONE = 'afterClone';
final public function clone(): static
{
if ($this->hasEventDispatcher()) {
$this->eventDispatcher()->dispatch(self::BEFORE_CLONE);
}
return clone $this;
}
public function __clone(): void
{ }
{
if (!$this->hasEventDispatcher()) {
return;
}
$this->eventDispatcher()->dispatch(self::AFTER_CLONE);
}
abstract public function eventDispatcher(): BaseDispatcher;
abstract public function hasEventDispatcher(): bool;
}