1.1 --- a/simplified.py Sun Jan 21 00:17:09 2007 +0100
1.2 +++ b/simplified.py Sun Jan 21 00:17:44 2007 +0100
1.3 @@ -405,26 +405,66 @@
1.4
1.5 class Structure(Node): "A non-program node containing some kind of namespace."
1.6
1.7 -class Class(Structure, WithName):
1.8 +class _Class(Structure, WithName):
1.9
1.10 "A Python class."
1.11
1.12 def __init__(self, *args, **kw):
1.13 Structure.__init__(self, *args, **kw)
1.14 WithName.__init__(self)
1.15 - self.instances = []
1.16
1.17 def full_name(self):
1.18 return "class %s" % self._full_name
1.19
1.20 +class SingleInstanceClass(_Class):
1.21 +
1.22 + "A Python class."
1.23 +
1.24 + def __init__(self, *args, **kw):
1.25 + _Class.__init__(self, *args, **kw)
1.26 + self.instance = None
1.27 +
1.28 + def has_instance(self, node):
1.29 + return self.instance is not None
1.30 +
1.31 + def add_instance(self, node, instance):
1.32 + self.instance = instance
1.33 +
1.34 + def get_instance(self, node):
1.35 + return self.instance
1.36 +
1.37 + def get_instance_name(self, instance):
1.38 + return self._full_name
1.39 +
1.40 +class MultipleInstanceClass(_Class):
1.41 +
1.42 + "A Python class."
1.43 +
1.44 + def __init__(self, *args, **kw):
1.45 + _Class.__init__(self, *args, **kw)
1.46 + self.instances = {}
1.47 +
1.48 + def has_instance(self, node):
1.49 + key = id(node)
1.50 + return self.instances.has_key(key)
1.51 +
1.52 + def add_instance(self, node, instance):
1.53 + key = id(node)
1.54 + self.instances[key] = instance
1.55 +
1.56 + def get_instance(self, node):
1.57 + key = id(node)
1.58 + return self.instances[key]
1.59 +
1.60 + def get_instance_name(self, instance):
1.61 + return name(instance, self._full_name)
1.62 +
1.63 class Instance(Structure):
1.64
1.65 "An instance."
1.66
1.67 def full_name(self):
1.68 - # NOTE: Wrap the result in a call to name(self, ...) where multiple
1.69 - # NOTE: instances per class can occur.
1.70 - return self.get_class()._full_name
1.71 + return self.get_class().get_instance_name(self)
1.72
1.73 def get_class(self):
1.74 return self.namespace.load("__class__")[0].type
1.75 @@ -433,7 +473,8 @@
1.76 return "Instance of type '%s'" % self.full_name()
1.77
1.78 def __eq__(self, other):
1.79 - # NOTE: Assuming that multiple instances of the same class are equal.
1.80 + # NOTE: Single instance: all instances are the same
1.81 + # NOTE: Multiple instances: all instances are different
1.82 return self.full_name() == other.full_name()
1.83
1.84 def __hash__(self):
1.85 @@ -447,4 +488,17 @@
1.86 Instance.__init__(self, *args, **kw)
1.87 self.typename = self.value.__class__.__name__
1.88
1.89 +# Configuration setting.
1.90 +
1.91 +Class = SingleInstanceClass
1.92 +#Class = MultipleInstanceClass
1.93 +
1.94 +def set_single_instance_mode():
1.95 + global Class
1.96 + Class = SingleInstanceClass
1.97 +
1.98 +def set_multiple_instance_mode():
1.99 + global Class
1.100 + Class = MultipleInstanceClass
1.101 +
1.102 # vim: tabstop=4 expandtab shiftwidth=4