'Called on this object if an object inside this object speaks.
The string returned from this method is the final form of the
speech.
Args:
speaker (Object): The object speaking.
message (str): The words spoken.
Returns:
The message to be said (str) or None.
Notes:
You should not need to add things like \'you say: \' or
similar here, that should be handled by the say command before
this.'

def at_say(self, speaker, message):

    allow = self.callbacks.call('can_say', speaker, self, message, parameters=message)
    if (not allow):
        return
    message = self.callbacks.get_variable('message')
    for present in [o for o in self.contents if (isinstance(o, DefaultCharacter) and (o is not speaker))]:
        allow = present.callbacks.call('can_say', speaker, present, message, parameters=message)
        if (not allow):
            return
        message = present.callbacks.get_variable('message')
    delay(0, self.callbacks.call, 'say', speaker, self, message, parameters=message)
    for present in [o for o in self.contents if (isinstance(o, DefaultCharacter) and (o is not speaker))]:
        delay(0, present.callbacks.call, 'say', speaker, present, message, parameters=message)
    return message
