async def create_role(self, *, reason=None, **fields):
        """|coro|

        Creates a :class:`Role` for the guild.

        All fields are optional.

        You must have the :attr:`~Permissions.manage_roles` permission to
        do this.

        Parameters
        -----------
        name: :class:`str`
            The role name. Defaults to 'new role'.
        permissions: :class:`Permissions`
            The permissions to have. Defaults to no permissions.
        colour: :class:`Colour`
            The colour for the role. Defaults to :meth:`Colour.default`.
            This is aliased to ``color`` as well.
        hoist: :class:`bool`
            Indicates if the role should be shown separately in the member list.
            Defaults to False.
        mentionable: :class:`bool`
            Indicates if the role should be mentionable by others.
            Defaults to False.
        reason: Optional[:class:`str`]
            The reason for creating this role. Shows up on the audit log.

        Raises
        -------
        Forbidden
            You do not have permissions to create the role.
        HTTPException
            Creating the role failed.
        InvalidArgument
            An invalid keyword argument was given.

        Returns
        --------
        :class:`Role`
            The newly created role.
        """

        try:
            perms = fields.pop('permissions')
        except KeyError:
            fields['permissions'] = 0
        else:
            fields['permissions'] = perms.value

        try:
            colour = fields.pop('colour')
        except KeyError:
            colour = fields.get('color', Colour.default())
        finally:
            fields['color'] = colour.value

        valid_keys = ('name', 'permissions', 'color', 'hoist', 'mentionable')
        for key in fields:
            if key not in valid_keys:
                raise InvalidArgument('%r is not a valid field.' % key)

        data = await self._state.http.create_role(self.id, reason=reason, **fields)
        role = Role(guild=self, data=data, state=self._state)

        # TODO: add to cache
        return role