contract GameCardMintable is
    ERC721,
    ERC721Metadata,
    GameCardAttributes,
    Governable
{
    /**
     * @dev Function to mint tokens.
     *      Throws if the msg.sender is not governor.
     * @param to The address that will receive the minted tokens.
     * @param tokenId The token id to mint.
     * @param uri The uri of the minted token.
     * @param tribe The tribe of the minted token.
     * @param level The level of the minted token.
     * @param experience The experience of the minted token.
     * @return A boolean that indicates if the operation was successful.
     */
    function mint(
        address to,
        uint256 tokenId,
        string memory uri,
        string memory tribe,
        uint256 level,
        uint256 experience
    )
        public
        onlyGovernor
        returns (bool)
    {
        _mint(to, tokenId);
        // ERC721Metadata
        _setTokenURI(tokenId, uri);
        // GameCardAttributes
        _setTokenTribe(tokenId, tribe);
        _setTokenLevel(tokenId, level);
        _setTokenExperience(tokenId, experience);
        return true;
    }

    /**
     * @dev Function to set the token tribe for a given token.
     *      Throws if the msg.sender is not governor.
     * @param tokenId uint256 ID of the token
     * @param tribe string tribe to assign
     * @return A boolean that indicates if the operation was successful.
     */
    function setTokenTribe(uint256 tokenId, string calldata tribe)
        external
        onlyGovernor
        returns (bool)
    {
        _setTokenTribe(tokenId, tribe);
        return true;
    }

    /**
     * @dev Function to set the token level for a given token.
     *      Throws if the msg.sender is not governor.
     * @param tokenId uint256 ID of the token
     * @param level uint256 level to assign
     * @return A boolean that indicates if the operation was successful.
     */
    function setTokenLevel(uint256 tokenId, uint256 level)
        external
        onlyGovernor
        returns (bool)
    {
        _setTokenLevel(tokenId, level);
        return true;
    }

    /**
     * @dev Function to set the token experience for a given token.
     *      Throws if the msg.sender is not governor.
     * @param tokenId uint256 ID of the token
     * @param experience uint256 experience to assign
     * @return A boolean that indicates if the operation was successful.
     */
    function setTokenExperience(uint256 tokenId, uint256 experience)
        external
        onlyGovernor
        returns (bool)
    {
        _setTokenExperience(tokenId, experience);
        return true;
    }
}
function setTokenExperience(uint256 tokenId, uint256 experience)
        external
        onlyGovernor
        returns (bool)
    {
        _setTokenExperience(tokenId, experience);
        return true;
    }
/**
 * @dev Function to set the token experience for a given token.
 *      Throws if the msg.sender is not governor.
 * @param tokenId uint256 ID of the token
 * @param experience uint256 experience to assign
 * @return A boolean that indicates if the operation was successful.
 */