From 117647c35f02461bb804da515cc8c3a5e48e95ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ji=C5=99=C3=AD=20Pudil?= <me@jiripudil.cz>
Date: Fri, 30 Oct 2020 13:18:50 +0100
Subject: [PATCH] Add Table::newEmpty() that preserves the original behaviour
 of new(). It can still be useful at times

---
 src/Scaffolding/ModificationsDecorator.php | 35 ++--------------------
 src/Scaffolding/Scaffolding.php            |  2 +-
 src/Scaffolding/TableDecorator.php         | 27 ++++++++++-------
 3 files changed, 21 insertions(+), 43 deletions(-)

diff --git a/src/Scaffolding/ModificationsDecorator.php b/src/Scaffolding/ModificationsDecorator.php
index dbdbc89..049fc6e 100644
--- a/src/Scaffolding/ModificationsDecorator.php
+++ b/src/Scaffolding/ModificationsDecorator.php
@@ -20,17 +20,11 @@ final class ModificationsDecorator implements ClassDecorator
 
 	private string $primaryKeyClass;
 
-	private array $columnInfo;
-
-	/**
-	 * @param Column[] $columnInfo
-	 */
-	public function __construct(string $relatedTable, string $primaryKeyClass, array $columnInfo)
+	public function __construct(string $relatedTable, string $primaryKeyClass)
 	{
 		$this->modificationsStorage = '$this->modifications';
 		$this->relatedTableClass = $relatedTable;
 		$this->primaryKeyClass = $primaryKeyClass;
-		$this->columnInfo = $columnInfo;
 	}
 
 
@@ -57,34 +51,11 @@ final class ModificationsDecorator implements ClassDecorator
 			])
 			->setBody('return self::_update($primaryKey);');
 
-		$newMethod = $classType->addMethod('new')
+		$classType->addMethod('new')
 			->setStatic()
 			->setVisibility('public')
 			->setReturnType('self')
-			->addBody('$self = self::_new();');
-		foreach ($definition->getFields() as $fieldName => $fieldType) {
-			$columnInfo = $this->columnInfo[$fieldName];
-			if ( ! $columnInfo->hasDefaultValue()) {
-				$newMethod->addParameter($fieldName)
-					->setTypeHint($fieldType->getTypeHint())
-					->setNullable($fieldType->isNullable());
-
-				if ($fieldType->requiresDocComment()) {
-					$newMethod->addComment(\sprintf(
-						'@param %s $%s%s',
-						$fieldType->getDocCommentType($namespace),
-						$fieldName,
-						$fieldType->hasComment() ? ' ' . $fieldType->getComment($namespace) : '',
-					));
-				}
-
-				$newMethod->addBody('$self->modifications[?] = ?;', [
-					$fieldName,
-					new PhpLiteral('$' . $fieldName),
-				]);
-			}
-		}
-		$newMethod->addBody('return $self;');
+			->setBody('return self::_new();');
 
 		// implement forTable method
 		$namespace->addUse($this->relatedTableClass);
diff --git a/src/Scaffolding/Scaffolding.php b/src/Scaffolding/Scaffolding.php
index bbf469c..2edb17c 100644
--- a/src/Scaffolding/Scaffolding.php
+++ b/src/Scaffolding/Scaffolding.php
@@ -69,7 +69,7 @@ final class Scaffolding
 
 			// row modification class
 			$addTableFields(new ClassDefinitionBuilder($modificationClass))
-				->decorate(new ModificationsDecorator($tableClass, $primaryKeyClass, $columnsNativeTypes))
+				->decorate(new ModificationsDecorator($tableClass, $primaryKeyClass))
 				->build(),
 
 			// table class
diff --git a/src/Scaffolding/TableDecorator.php b/src/Scaffolding/TableDecorator.php
index 90313f4..526ec36 100644
--- a/src/Scaffolding/TableDecorator.php
+++ b/src/Scaffolding/TableDecorator.php
@@ -148,10 +148,20 @@ final class TableDecorator implements ClassDecorator
 			);
 
 		foreach (['add', 'new'] as $methodName) {
+			$classType->addMethod("${methodName}Empty")
+				->setReturnType($this->modificationClass)
+				->setBody(
+					'return ?::new();',
+					[new Code\PhpLiteral($namespace->unresolveName($this->modificationClass))],
+				);
+
 			$addMethod = $classType->addMethod($methodName)
-				->setReturnType($this->modificationClass);
+				->setReturnType($this->modificationClass)
+				->addBody(
+					'$modifications = ?::new();',
+					[new Code\PhpLiteral($namespace->unresolveName($this->modificationClass))],
+				);
 
-			$fieldNames = [];
 			foreach ($this->columnInfo as $columnInfo) {
 				if ( ! $columnInfo->hasDefaultValue()) {
 					$fieldName = $columnInfo->getName();
@@ -170,17 +180,14 @@ final class TableDecorator implements ClassDecorator
 						));
 					}
 
-					$fieldNames[] = new Code\PhpLiteral('$' . $fieldName);
+					$addMethod->addBody(
+						'$modifications->modify' . \ucfirst($fieldName) . '(?);',
+						[new Code\PhpLiteral('$' . $fieldName)],
+					);
 				}
 			}
 
-			$addMethod->setBody(
-				'return ?::new(...?);',
-				[
-					new Code\PhpLiteral($namespace->unresolveName($this->modificationClass)),
-					$fieldNames,
-				]
-			);
+			$addMethod->addBody('return $modifications;');
 		}
 
 
-- 
GitLab