Browse Source

added POD.copyFrom, removed copy-constructor behavior

Darren Ranalli 20 years ago
parent
commit
962e2b92d8
1 changed files with 53 additions and 28 deletions
  1. 53 28
      direct/src/showbase/PythonUtil.py

+ 53 - 28
direct/src/showbase/PythonUtil.py

@@ -1170,44 +1170,49 @@ class POD:
         # base class does not define any data items, but they would
         # appear here as 'name': value,
         }
-    def __init__(self, *args, **kwArgs):
+    def __init__(self, **kwArgs):
         self.__class__._compileDefaultDataSet()
-        if len(args) == 1 and len(kwArgs) == 0:
-            # extract our dataset from an existing POD instance
-            obj = args[0]
-            for name in self.getDataNames():
-                # if the other obj doesn't have this data item, stick to the
-                # default
-                if hasattr(obj, name):
-                    setattr(self, name, getattr(obj, name))
-                else:
-                    setattr(self, name, self.getDefaultValue(name))
-        else:
-            assert len(args) == 0
-            if __debug__:
-                for arg in kwArgs.keys():
-                    assert arg in self.getDataNames(), (
-                        "unknown argument for %s: '%s'" % (
-                        self.__class__, arg))
-            for name in self.getDataNames():
-                if name in kwArgs:
-                    setattr(self, name, kwArgs[name])
-                else:
-                    setattr(self, name, self.getDefaultValue(name))
+        if __debug__:
+            for arg in kwArgs.keys():
+                assert arg in self.getDataNames(), (
+                    "unknown argument for %s: '%s'" % (
+                    self.__class__, arg))
+        for name in self.getDataNames():
+            if name in kwArgs:
+                getSetter(self, name)(kwArgs[name])
+            else:
+                getSetter(self, name)(self.getDefaultValue(name))
 
     def setDefaultValues(self):
         # set all the default data values on ourself
         for name in self.getDataNames():
-            setattr(self, name, self.getDefaultValue(name))
+            getSetter(self, name)(self.getDefaultValue(name))
+    # this functionality used to be in the constructor, triggered by a single
+    # positional argument; that was conflicting with POD subclasses that wanted
+    # to define different behavior for themselves when given a positional
+    # constructor argument
+    def copyFrom(self, other, strict=False):
+        # if 'strict' is true, other must have a value for all of our data items
+        # otherwise we'll use the defaults
+        for name in self.getDataNames():
+            if hasattr(other, getSetterName(name, 'get')):
+                setattr(self, name, getSetter(other, name, 'get')())
+            else:
+                if strict:
+                    raise "object '%s' doesn't have value '%s'" % (other, name)
+                else:
+                    setattr(self, name, self.getDefaultValue(name))
+        # support 'p = POD.POD().copyFrom(other)'
+        return self
     def makeCopy(self):
         # returns a duplicate of this object
-        return self.__class__(self)
+        return self.__class__().copyFrom(self)
     def applyTo(self, obj):
         # Apply our entire set of data to another POD
         for name in self.getDataNames():
-            setattr(obj, name, getattr(self, name))
+            getSetter(obj, name)(getSetter(self, name, 'get')())
     def getValue(self, name):
-        return getattr(self, name)
+        return getSetter(self, name, 'get')()
 
     # CLASS METHODS
     def getDataNames(cls):
@@ -1257,9 +1262,29 @@ class POD:
     def __repr__(self):
         argStr = ''
         for name in self.getDataNames():
-            argStr += '%s=%s,' % (name, repr(getattr(self, name)))
+            argStr += '%s=%s,' % (name, repr(getSetter(self, name, 'get')()))
         return '%s(%s)' % (self.__class__.__name__, argStr)
 
+    """ TODO
+    if __dev__:
+        @staticmethod
+        def unitTest():
+            tColor = 'red'
+            tColor2 = 'blue'
+            class test(POD):
+                DataSet = {
+                    'color': tColor,
+                    }
+
+            t = test()
+            assert t.getColor() == tColor
+            t.setColor(tColor2)
+            assert t.getColor() == tColor2
+
+            t2 = test().makeCopy()
+            assert t2.getColor() == t.getColor() == tColor2
+            """
+
 def bound(value, bound1, bound2):
     """
     returns value if value is between bound1 and bound2