From 2c2a7fab47d87ff461d7e9073e15a9d5155a4a65 Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <the@jeffreyfreeman.me>
Date: Mon, 27 Apr 2020 20:06:42 +0200
Subject: [PATCH] Moved hydration out into a mixin.

---
 lib/aethyr/core/objects/game_object.rb | 27 +--------------
 lib/aethyr/core/util/hydration.rb      | 47 ++++++++++++++++++++++++++
 lib/aethyr/core/util/publisher.rb      |  6 +++-
 3 files changed, 53 insertions(+), 27 deletions(-)
 create mode 100644 lib/aethyr/core/util/hydration.rb

diff --git a/lib/aethyr/core/objects/game_object.rb b/lib/aethyr/core/objects/game_object.rb
index 8523299..f238ed9 100644
--- a/lib/aethyr/core/objects/game_object.rb
+++ b/lib/aethyr/core/objects/game_object.rb
@@ -12,13 +12,6 @@ class GameObject < Publisher
   include Observable
   include Pronoun
 
-  @@volatile = []
-
-  def self.volatile(*attrs)
-    @@volatile += attrs
-    @@volatile.uniq!
-  end
-
   attr_reader :short_desc, :game_object_id, :alt_names, :generic, :article, :sex, :show_in_look, :actions, :balance, :admin, :manager
   attr_accessor :container, :show_in_look, :actions, :pose, :visible, :comment, :movable, :quantity, :info
   attr_writer :plural
@@ -80,32 +73,14 @@ class GameObject < Publisher
     @admin = false
   end
 
-  # removes all volatle data but provides it as a map for restoration in rehydrate
-  def dehydrate
-    volatile_data = {}
-    @@volatile.each do |attr|
-      if self.instance_variable_defined?(attr)
-        volatile_data[attr] = self.instance_variable_get(attr)
-        begin
-          self.remove_instance_variable(attr)
-        rescue NameError
-        end
-      end
-    end
-    return volatile_data
-  end
-
   def rehydrate(volatile_data)
+    super(volatile_data)
     if volatile_data.nil?
       if RUBY_VERSION < "1.9.0"
         self.instance_variable_set(:@observer_peers, [])
       else
         self.instance_variable_set(:@observer_peers, {})
       end
-      return
-    end
-    volatile_data.each do |attr, data|
-      self.instance_variable_set(attr, data) if @@volatile.include? attr
     end
   end
 
diff --git a/lib/aethyr/core/util/hydration.rb b/lib/aethyr/core/util/hydration.rb
new file mode 100644
index 0000000..b17be9c
--- /dev/null
+++ b/lib/aethyr/core/util/hydration.rb
@@ -0,0 +1,47 @@
+module Aethyr
+  module Core
+    module Storage
+      module Hydration
+        module Volatile
+          @@volatile ||= []
+
+          def volatile(*attrs)
+            @@volatile = [] if @@volatile.nil?
+            @@volatile += attrs
+            @@volatile.uniq!
+          end
+
+          def volatile_vars
+            return @@volatile
+          end
+        end
+
+        # removes all volatle data but provides it as a map for restoration in rehydrate
+        def dehydrate
+          volatile_data = {}
+          self.class.volatile_vars.each do |attr|
+            if self.instance_variable_defined?(attr)
+              volatile_data[attr] = self.instance_variable_get(attr)
+              begin
+                self.remove_instance_variable(attr)
+              rescue NameError
+              end
+            end
+          end
+          return volatile_data
+        end
+
+        def rehydrate(volatile_data)
+          return if volatile_data.nil?
+          volatile_data.each do |attr, data|
+            self.instance_variable_set(attr, data) if self.class.volatile_vars.include? attr
+          end
+        end
+
+        def self.included(klass)
+          klass.extend(Volatile)
+        end
+      end
+    end
+  end
+end
diff --git a/lib/aethyr/core/util/publisher.rb b/lib/aethyr/core/util/publisher.rb
index 6d4628b..2b18692 100644
--- a/lib/aethyr/core/util/publisher.rb
+++ b/lib/aethyr/core/util/publisher.rb
@@ -1,7 +1,11 @@
 require 'aethyr/core/util/marshaller'
+require 'aethyr/core/util/hydration'
 require 'wisper'
 
 class Publisher
+  include Aethyr::Core::Storage::Hydration
   include Marshaller[:@observer_peers, :@local_registrations]
   include Wisper::Publisher
-end
\ No newline at end of file
+
+  volatile :@local_registrations
+end
-- 
GitLab