From 24409f3ad20d7d2a7e1c827af313c8e2757aa4ed Mon Sep 17 00:00:00 2001
From: Owen Bush <ojb@ukhhf.co.uk>
Date: Sat, 13 Apr 2019 13:36:22 -0600
Subject: [PATCH] Refactor the inheritance plugin to make it easier to override
 certain inheritance strategy/methods

---
 .../FieldInheritancePluginBase.php            | 106 ++++++++++++------
 .../StringFieldInheritancePlugin.php          |   4 +-
 .../TextLongFieldInheritancePlugin.php        |   4 +-
 3 files changed, 78 insertions(+), 36 deletions(-)

diff --git a/src/Plugin/FieldInheritance/FieldInheritancePluginBase.php b/src/Plugin/FieldInheritance/FieldInheritancePluginBase.php
index 7a8e92e..c59784f 100644
--- a/src/Plugin/FieldInheritance/FieldInheritancePluginBase.php
+++ b/src/Plugin/FieldInheritance/FieldInheritancePluginBase.php
@@ -104,56 +104,94 @@ abstract class FieldInheritancePluginBase extends PluginBase implements FieldInh
   public function computeValue() {
     $this->validateArguments();
     $method = $this->getMethod();
-    $field = $this->getSourceField();
 
-    $instance = $this->entity;
-    $series = $instance->getEventSeries();
     $value = '';
-
     switch ($method) {
       case 'inherit':
-        $value = $series->{$field}->value ?? '';
+        $value = $this->inheritData();
         break;
 
       case 'prepend':
-        $entity_field = $this->getEntityField();
-
-        $fields = [];
-        if (!empty($instance->{$entity_field}->value)) {
-          $fields[] = $instance->{$entity_field}->value;
-        }
-        if (!empty($series->{$field}->value)) {
-          $fields[] = $series->{$field}->value;
-        }
-        $value = implode($this::SEPARATOR, $fields);
+        $value = $this->prependData();
         break;
 
       case 'append':
-        $entity_field = $this->getEntityField();
-
-        $fields = [];
-        if (!empty($series->{$field}->value)) {
-          $fields[] = $series->{$field}->value;
-        }
-        if (!empty($instance->{$entity_field}->value)) {
-          $fields[] = $instance->{$entity_field}->value;
-        }
-        $value = implode($this::SEPARATOR, $fields);
+        $value = $this->appendData();
         break;
 
       case 'fallback':
-        $entity_field = $this->getEntityField();
+        $value = $this->fallbackData();
+        break;
+    }
+    return $value;
+  }
 
-        $value = '';
+  /**
+   * Retrieve inherited data.
+   *
+   * @return string
+   *   The inherited data.
+   */
+  protected function inheritData() {
+    $series = $this->entity->getEventSeries();
+    return $series->{$this->getSourceField()}->value ?? '';
+  }
 
-        if (!empty($instance->{$entity_field}->value)) {
-          $value = $instance->{$entity_field}->value;
-        }
-        elseif (!empty($series->{$field}->value)) {
-          $value = $series->{$field}->value;
-        }
+  /**
+   * Retrieve prepended data.
+   *
+   * @return string
+   *   The prepended data.
+   */
+  protected function prependData() {
+    $series = $this->entity->getEventSeries();
+    $instance = $this->entity;
 
-        break;
+    $fields = [];
+    if (!empty($instance->{$this->getEntityField()}->value)) {
+      $fields[] = $instance->{$this->getEntityField()}->value;
+    }
+    if (!empty($series->{$this->getSourceField()}->value)) {
+      $fields[] = $series->{$this->getSourceField()}->value;
+    }
+    return implode($this::SEPARATOR, $fields);
+  }
+
+  /**
+   * Retrieve appended data.
+   *
+   * @return string
+   *   The appended data.
+   */
+  protected function appendData() {
+    $series = $this->entity->getEventSeries();
+    $instance = $this->entity;
+
+    $fields = [];
+    if (!empty($series->{$this->getSourceField()}->value)) {
+      $fields[] = $series->{$this->getSourceField()}->value;
+    }
+    if (!empty($instance->{$this->getEntityField()}->value)) {
+      $fields[] = $instance->{$this->getEntityField()}->value;
+    }
+    return implode($this::SEPARATOR, $fields);
+  }
+
+  /**
+   * Retrieve fallback data.
+   *
+   * @return string
+   *   The fallback data.
+   */
+  protected function fallbackData() {
+    $series = $this->entity->getEventSeries();
+    $instance = $this->entity;
+
+    if (!empty($instance->{$this->getEntityField()}->value)) {
+      $value = $instance->{$this->getEntityField()}->value;
+    }
+    elseif (!empty($series->{$this->getSourceField()}->value)) {
+      $value = $series->{$this->getSourceField()}->value;
     }
     return $value;
   }
diff --git a/src/Plugin/FieldInheritance/StringFieldInheritancePlugin.php b/src/Plugin/FieldInheritance/StringFieldInheritancePlugin.php
index 66134ea..cff450d 100644
--- a/src/Plugin/FieldInheritance/StringFieldInheritancePlugin.php
+++ b/src/Plugin/FieldInheritance/StringFieldInheritancePlugin.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\recurring_events\Plugin\FieldInheritance;
 
+use Drupal\recurring_events\FieldInheritancePluginInterface;
+
 /**
  * String Inheritance plugin.
  *
@@ -13,7 +15,7 @@ namespace Drupal\recurring_events\Plugin\FieldInheritance;
  *   }
  * )
  */
-class StringFieldInheritancePlugin extends FieldInheritancePluginBase {
+class StringFieldInheritancePlugin extends FieldInheritancePluginBase implements FieldInheritancePluginInterface {
 
   /**
    * Concatenation separator.
diff --git a/src/Plugin/FieldInheritance/TextLongFieldInheritancePlugin.php b/src/Plugin/FieldInheritance/TextLongFieldInheritancePlugin.php
index db8f44c..1ace678 100644
--- a/src/Plugin/FieldInheritance/TextLongFieldInheritancePlugin.php
+++ b/src/Plugin/FieldInheritance/TextLongFieldInheritancePlugin.php
@@ -2,6 +2,8 @@
 
 namespace Drupal\recurring_events\Plugin\FieldInheritance;
 
+use Drupal\recurring_events\FieldInheritancePluginInterface;
+
 /**
  * Text Long Inheritance plugin.
  *
@@ -13,7 +15,7 @@ namespace Drupal\recurring_events\Plugin\FieldInheritance;
  *   }
  * )
  */
-class TextLongFieldInheritancePlugin extends FieldInheritancePluginBase {
+class TextLongFieldInheritancePlugin extends FieldInheritancePluginBase implements FieldInheritancePluginInterface {
 
   /**
    * Concatenation separator.
-- 
GitLab