#------------------------------------------------------------------------------
#
#		Python GUI - Properties - Generic
#
#------------------------------------------------------------------------------

class Properties(object):
    """
    This class implements the standard interface for initialising
    properties using keyword arguments.
    """

    def __init__(self, **kw):
        "Properties(name=value, ...) passes the given arguments to the set() method."
        self.set(**kw)

    def set(self, **kw):
        """set(name=value, ...) sets property values according to the given 
        keyword arguments. Will only set attributes for which a descriptor exists."""
        cls = self.__class__
        for name, value in kw.iteritems():
            try:
                s = getattr(cls, name).__set__
            except AttributeError:
                raise TypeError("%s object has no writable property %r" % (
                    self.__class__.__name__, name))			
            s(self, value)

#------------------------------------------------------------------------------

def overridable_property(name, doc = None):
    """Creates a property which calls methods get_xxx and set_xxx of
    the underlying object to get and set the property value, so that
    the property's behaviour may be easily overridden by subclasses."""
    
    getter_name = intern('get_' + name)
    setter_name = intern('set_' + name)
    return property(
        lambda self: getattr(self, getter_name)(),
        lambda self, value: getattr(self, setter_name)(value),
        None,
        doc)
