def __init__(self):
        """
        Initializes variables and registers the 'attribute_changed' signal.

        It is neccessary for each subclass to call CONObject's __init__, failing to do so
        will prevent the subclass to use signals and attributes.
        """
        # register our class, if not registered before
        if self.__class__ not in CONObject._class_registry:
            CONObject._register_class(self.__class__)

        # init signal callback lists
        if "_callbacks" not in self.__class__.__dict__:
            self.__class__._callbacks = {}
            for signal in CONObject._class_registry[self.__class__]["callbacks"]:
                self.__class__._callbacks[signal] = []

        # init attribute list
        if "_attributes" not in self.__class__.__dict__:
            self.__class__._attributes = CONObject._class_registry[self.__class__]["attributes"].copy()
            # try calling any _on_..._changed method
            mname = "_on_" + name + "_changed"
            if hasattr(self, mname):
                method = getattr(self, mname)
                method(oldvalue, value)

            self.raise_signal("attribute_changed", name, oldvalue, value)

    def __getattr__(self, name):
        """
        Return the value of the attribute.

        When the object's uuid is requested but the object has no uuid yet, the uuid is created.
        """
        if name[0:1] == "_":
            return self.__class__.__dict__[name]
        else:
            if (name == "uuid") and (self.__class__.__dict__["_attributes"]["uuid"] == None):
                self.__class__.__dict__["_attributes"]["uuid"] = uuid.uuid4()
            return self.__class__.__dict__["_attributes"][name]

    def get_attribute_list(self):
        """
        Returns the list of attributes that are managed by CONObject.
        """
        return self.__class__._attributes.keys()


CONObject.register_attribute_type("CONBorg", CONBorg.object_serializer, CONBorg.object_deserializer)