contract DescriptiveToken is BasicToken, Ownable {

    string public name;
    string public symbol;
    bool public isDescriptionFinalized;
    uint256 public decimals = 18;

    function DescriptiveToken(
        string _name,
        string _symbol
    )
        public
        onlyNotEmpty(_name)
        onlyNotEmpty(_symbol)
    {
        name = _name;
        symbol = _symbol;
    }

    /**
     * @dev Logs change of token name and symbol
     * @param name string The new token name
     * @param symbol string The new token symbol
     */
    event DescriptionChanged(string name, string symbol);

    /**
     * @dev Further changes to name and symbol are forbidden
     */
    event DescriptionFinalized();

    modifier onlyNotEmpty(string str) {
        require(bytes(str).length > 0);
        _;
    }

    modifier onlyDescriptionNotFinalized() {
        require(!isDescriptionFinalized);
        _;
    }

    /**
     * @dev Change name and symbol of tokens
     * @dev May be used in case of symbol collisions in exchanges.
     * @param _name string A new token name
     * @param _symbol string A new token symbol
     */
    function changeDescription(string _name, string _symbol)
        public
        onlyOwner
        onlyDescriptionNotFinalized
        onlyNotEmpty(_name)
        onlyNotEmpty(_symbol)
    {
        name = _name;
        symbol = _symbol;

        DescriptionChanged(name, symbol);
    }

    /**
     * @dev Prevents further changes to name and symbol
     */
    function finalizeDescription()
        public
        onlyOwner
        onlyDescriptionNotFinalized
    {
        isDescriptionFinalized = true;

        DescriptionFinalized();
    }
}
/**
 * @title A token with modifiable name and symbol
 * @author Jakub Stefanski (https://github.com/jstefanski)
 *
 * https://github.com/OnLivePlatform/onlive-contracts
 *
 * The BSD 3-Clause Clear License
 * Copyright (c) 2018 OnLive LTD
 */
function changeDescription(string _name, string _symbol)
    public
    onlyOwner
    onlyDescriptionNotFinalized
    onlyNotEmpty(_name)
    onlyNotEmpty(_symbol)
{
    name = _name;
    symbol = _symbol;

    DescriptionChanged(name, symbol);
}

/**
 * @dev Change name and symbol of tokens
 * @dev May be used in case of symbol collisions in exchanges.
 * @param _name string A new token name
 * @param _symbol string A new token symbol
 */