"""This module contains the GtkAttributesFacade class.""" from gobject import GObject class GtkAttributesFacade: """Wrap a GTK instance to simplify the way attributes are referenced. Given a GTK instance i, make it possible for any functions i.get_foo() and i.set_foo(value) to be accessed via i.foo like a normal attribute. The following attributes are used: instance - This is the GTK instance that is being wrapped. """ def __init__(self, instance): """Accept the instance.""" self.__dict__["instance"] = instance def __setattr__(self, name, value): """Simplify the way attributes are referenced. When trying to do self.foo = something, if there is a self.instance.set_foo() method, use it. Otherwise, just set the attribute in self. Return value so that chaining is possible. """ setter = "set_" + name if hasattr(self.instance, setter): apply(getattr(self.instance, setter), [value]) else: self.__dict__[name] = value return value def __getattr__(self, name): """Simplify the way attributes are referenced. Remember that this method is called after a failed lookup in self. Try looking for self.instance.foo. Next, try looking for a self.instance.get_foo() method, and call it if it exists. Otherwise, raise an exception. If a value is successfully looked up, and if it is a subclass of GObject, wrap it in a GtkAttributesFacade before returning it. """ getter = "get_" + name if hasattr(self.instance, name): ret = getattr(self.instance, name) elif hasattr(self.instance, getter): ret = apply(getattr(self.instance, getter)) else: raise AttributeError( "%s instance has no attribute '%s'" % (self.instance.__class__.__name__, name)) if isinstance(ret, GObject): ret = GtkAttributesFacade(ret) return ret