[kupfer: 49/51] obj.base: Avoid saving decorated sources in Leaf base class



commit ea797db6127f47c3f8c2141b06bd41be80272a34
Author: Ulrik Sverdrup <ulrik sverdrup gmail com>
Date:   Sun Jan 10 04:28:13 2010 +0100

    obj.base: Avoid saving decorated sources in Leaf base class
    
    The Leaf object allows saving sources on the object, to "decorate" it
    with content. If we are not careful, this decoration can be saved with
    the object when it is pickled.

 kupfer/obj/base.py |   18 +++++++++++++-----
 1 files changed, 13 insertions(+), 5 deletions(-)
---
diff --git a/kupfer/obj/base.py b/kupfer/obj/base.py
index 8fc8a84..d877fb2 100644
--- a/kupfer/obj/base.py
+++ b/kupfer/obj/base.py
@@ -143,6 +143,16 @@ def aslist(seq):
 		seq = list(seq)
 	return seq
 
+class _NonpersistentToken (object):
+	"Goes None when pickled"
+	__slots__ = "object"
+	def __init__(self, object_):
+		self.object = object_
+	def __nonzero__(self):
+		return bool(self.object)
+	def __reduce__(self):
+		return (eval, ("None", ))
+
 class Leaf (KupferObject):
 	"""
 	Base class for objects
@@ -154,7 +164,6 @@ class Leaf (KupferObject):
 		"""Represented object @obj and its @name"""
 		super(Leaf, self).__init__(name)
 		self.object = obj
-		self._has_content = None
 		self._content_source = None
 	
 	def __hash__(self):
@@ -165,16 +174,15 @@ class Leaf (KupferObject):
 
 	def add_content(self, content):
 		"""Register content source @content with Leaf"""
-		self._has_content = bool(content)
-		self._content_source = content
+		self._content_source = _NonpersistentToken(content)
 
 	def has_content(self):
-		return self._has_content
+		return self._content_source
 
 	def content_source(self, alternate=False):
 		"""Content of leaf. it MAY alter behavior with @alternate,
 		as easter egg/extra mode"""
-		return self._content_source
+		return self._content_source and self._content_source.object
 
 	def get_actions(self):
 		"""Default (builtin) actions for this Leaf"""



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]