tidy up value items
diff --git a/reclass/datatypes/parameters.py b/reclass/datatypes/parameters.py
index 3af80ff..baa92c3 100644
--- a/reclass/datatypes/parameters.py
+++ b/reclass/datatypes/parameters.py
@@ -222,7 +222,7 @@
 
     def _render_simple_container(self, container, key, value, path, options):
             if isinstance(value, ValueList):
-                if value.has_references() or value.has_exports():
+                if value.is_complex():
                     self._unrendered[path.new_subpath(key)] = True
                     return
                 else:
@@ -236,7 +236,7 @@
                 self._render_simple_list(value, path.new_subpath(key), options)
                 container[key] = value
             elif isinstance(value, Value):
-                if value.has_references() or value.has_exports():
+                if value.is_complex():
                     self._unrendered[path.new_subpath(key)] = True
                 else:
                     container[key] = value.render(None, None, options)
diff --git a/reclass/utils/compitem.py b/reclass/utils/compitem.py
index 12845f7..a49dfea 100644
--- a/reclass/utils/compitem.py
+++ b/reclass/utils/compitem.py
@@ -4,8 +4,9 @@
 # This file is part of reclass
 #
 
+from reclass.utils.item import Item
 
-class CompItem(object):
+class CompItem(Item):
 
     def __init__(self, items):
         self._items = items
@@ -35,9 +36,6 @@
     def get_references(self):
         return self._refs
 
-    def has_exports(self):
-        return False
-
     def render(self, context, exports):
         # Preserve type if only one item
         if len(self._items) == 1:
diff --git a/reclass/utils/dictitem.py b/reclass/utils/dictitem.py
index 1782e70..f652059 100644
--- a/reclass/utils/dictitem.py
+++ b/reclass/utils/dictitem.py
@@ -4,48 +4,16 @@
 # This file is part of reclass
 #
 
-class DictItem(object):
+from reclass.utils.item import Item
+
+class DictItem(Item):
 
     def __init__(self, item):
         self._dict = item
-        self._refs = []
-        self._allRefs = False
-        self.assembleRefs()
-
-    def assembleRefs(self, context={}):
-        self._refs = []
-        self._allRefs = True
-        self._assembleRefs_recurse_dict(self._dict)
-
-    def _assembleRefs_recurse_dict(self, items):
-        from reclass.utils.value import Value
-        from reclass.utils.valuelist import ValueList
-
-        for key, item in items.iteritems():
-            if isinstance(item, dict):
-                self._assembleRefs_recurse_dict(item)
-                continue
-            if isinstance(item, (Value, ValueList)) and item.has_references():
-                for ref in item.get_references():
-                    self._refs.append(ref)
-                if not item.allRefs():
-                    self._allRefs = False
 
     def contents(self):
         return self._dict
 
-    def allRefs(self):
-        return self._allRefs
-
-    def has_references(self):
-        return len(self._refs) > 0
-
-    def has_exports(self):
-        return False
-
-    def get_references(self):
-        return self._refs
-
     def merge_over(self, item, options):
         from reclass.utils.scaitem import ScaItem
 
diff --git a/reclass/utils/expitem.py b/reclass/utils/expitem.py
index fe2bf31..3798165 100644
--- a/reclass/utils/expitem.py
+++ b/reclass/utils/expitem.py
@@ -5,9 +5,10 @@
 #
 
 from reclass.utils.dictpath import DictPath
+from reclass.utils.item import Item
 from reclass.errors import UndefinedVariableError
 
-class ExpItem(object):
+class ExpItem(Item):
 
     def __init__(self, items, delimiter):
         self._delimiter = delimiter
@@ -16,9 +17,6 @@
     def contents(self):
         return self._items
 
-    def has_references(self):
-        return False
-
     def has_exports(self):
         return True
 
diff --git a/reclass/utils/item.py b/reclass/utils/item.py
new file mode 100644
index 0000000..035f3fb
--- /dev/null
+++ b/reclass/utils/item.py
@@ -0,0 +1,25 @@
+#
+# -*- coding: utf-8 -*-
+#
+# This file is part of reclass
+#
+
+from reclass.utils.dictpath import DictPath
+from reclass.errors import UndefinedVariableError
+
+class Item(object):
+
+    def __init__(self):
+        return
+
+    def allRefs(self):
+        return True
+
+    def has_references(self):
+        return False
+
+    def has_exports(self):
+        return False
+
+    def is_complex():
+        return (self.has_references | self.has_exports)
diff --git a/reclass/utils/listitem.py b/reclass/utils/listitem.py
index d80ebc9..a1c66bc 100644
--- a/reclass/utils/listitem.py
+++ b/reclass/utils/listitem.py
@@ -4,42 +4,16 @@
 # This file is part of reclass
 #
 
-class ListItem(object):
+from reclass.utils.item import Item
+
+class ListItem(Item):
 
     def __init__(self, item):
         self._list = item
-        self._refs = []
-        self._allRefs = False
-        self.assembleRefs()
-
-    def assembleRefs(self, context={}):
-        from reclass.utils.value import Value
-        from reclass.utils.valuelist import ValueList
-
-        self._refs = []
-        self._allRefs = True
-        for item in self._list:
-            if isinstance(item, (Value, ValueList)) and item.has_references():
-                for ref in item.get_references():
-                    self._refs.append(ref)
-                if not item.allRefs():
-                    self._allRefs = False
 
     def contents(self):
         return self._list
 
-    def allRefs(self):
-        return self._allRefs
-
-    def has_references(self):
-        return len(self._refs) > 0
-
-    def has_exports(self):
-        return False
-
-    def get_references(self):
-        return self._refs
-
     def render(self, context, exports):
         return self._list
 
diff --git a/reclass/utils/refitem.py b/reclass/utils/refitem.py
index 7f1f759..9e3b2d2 100644
--- a/reclass/utils/refitem.py
+++ b/reclass/utils/refitem.py
@@ -5,9 +5,10 @@
 #
 
 from reclass.utils.dictpath import DictPath
+from reclass.utils.item import Item
 from reclass.errors import UndefinedVariableError
 
-class RefItem(object):
+class RefItem(Item):
 
     def __init__(self, items, delimiter):
         self._delimiter = delimiter
@@ -40,9 +41,6 @@
     def has_references(self):
         return len(self._refs) > 0
 
-    def has_exports(self):
-        return False
-
     def get_references(self):
         return self._refs
 
diff --git a/reclass/utils/scaitem.py b/reclass/utils/scaitem.py
index 421afdc..6748945 100644
--- a/reclass/utils/scaitem.py
+++ b/reclass/utils/scaitem.py
@@ -6,30 +6,16 @@
 
 from reclass.utils.dictitem import DictItem
 from reclass.utils.listitem import ListItem
+from reclass.utils.item import Item
 
-class ScaItem(object):
+class ScaItem(Item):
 
     def __init__(self, value):
         self._value = value
 
-    def assembleRefs(self, context={}):
-        return
-
-    def allRefs(self):
-        return True
-
-    def has_references(self):
-        return False
-
-    def has_exports(self):
-        return False
-
     def contents(self):
         return self._value
 
-    def merge_over_with_context(self, item, context, options):
-        pass
-
     def merge_over(self, item, options):
         if isinstance(item, ScaItem):
             return self
diff --git a/reclass/utils/value.py b/reclass/utils/value.py
index 65dbe8d..d3ea13b 100644
--- a/reclass/utils/value.py
+++ b/reclass/utils/value.py
@@ -172,6 +172,9 @@
     def has_exports(self):
         return self._item.has_exports()
 
+    def is_complex(self):
+        return (self.has_references() | self.has_exports())
+
     def get_references(self):
         return self._refs
 
diff --git a/reclass/utils/valuelist.py b/reclass/utils/valuelist.py
index 29d6d68..b630a04 100644
--- a/reclass/utils/valuelist.py
+++ b/reclass/utils/valuelist.py
@@ -36,6 +36,9 @@
     def has_exports(self):
         return self._has_exports
 
+    def is_complex(self):
+        return (self.has_references() | self.has_exports())
+
     def get_references(self):
         return self._refs