def set(self, name, value, autodeclare=False):
        """Set the value of a key.

        This method will cause anyone waiting on a key (and any future
        waiters) to unblock and be returned the value you pass here.

        If the key has not been declared previously, a KeyError() is
        raised unless you pass ``autodeclare=True`` which will cause
        the key to be declared.  Normally you don't want to autodeclare.

        This method is not a coroutine and does not block.

        Args:
            name (str): The key to set
            value (object): The value to set
            autodeclare (bool): Whether to automatically declare the
                key if is has not already been declared.  Defaults to
                False.
        """

        if not autodeclare and name not in self._data:
            raise KeyError("Key {} has not been declared and autodeclare=False".format(name))

        self._ensure_declared(name)
        self._data[name].set_result(value)
Set the value of a key.

        This method will cause anyone waiting on a key (and any future
        waiters) to unblock and be returned the value you pass here.

        If the key has not been declared previously, a KeyError() is
        raised unless you pass ``autodeclare=True`` which will cause
        the key to be declared.  Normally you don't want to autodeclare.

        This method is not a coroutine and does not block.

        Args:
            name (str): The key to set
            value (object): The value to set
            autodeclare (bool): Whether to automatically declare the
                key if is has not already been declared.  Defaults to
                False.