summaryrefslogtreecommitdiffstats
path: root/pym/_emerge/SlotObject.py
diff options
context:
space:
mode:
Diffstat (limited to 'pym/_emerge/SlotObject.py')
-rw-r--r--pym/_emerge/SlotObject.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/pym/_emerge/SlotObject.py b/pym/_emerge/SlotObject.py
new file mode 100644
index 000000000..492382694
--- /dev/null
+++ b/pym/_emerge/SlotObject.py
@@ -0,0 +1,39 @@
+class SlotObject(object):
+ __slots__ = ("__weakref__",)
+
+ def __init__(self, **kwargs):
+ classes = [self.__class__]
+ while classes:
+ c = classes.pop()
+ if c is SlotObject:
+ continue
+ classes.extend(c.__bases__)
+ slots = getattr(c, "__slots__", None)
+ if not slots:
+ continue
+ for myattr in slots:
+ myvalue = kwargs.get(myattr, None)
+ setattr(self, myattr, myvalue)
+
+ def copy(self):
+ """
+ Create a new instance and copy all attributes
+ defined from __slots__ (including those from
+ inherited classes).
+ """
+ obj = self.__class__()
+
+ classes = [self.__class__]
+ while classes:
+ c = classes.pop()
+ if c is SlotObject:
+ continue
+ classes.extend(c.__bases__)
+ slots = getattr(c, "__slots__", None)
+ if not slots:
+ continue
+ for myattr in slots:
+ setattr(obj, myattr, getattr(self, myattr))
+
+ return obj
+