contract TokenHolders {
    address public owner;

    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;

    /*
        TokenHolders contract is being connected to OptionToken on creation.
        Nobody can modify balanceOf and allowance except OptionToken
    */

    function validate() external constant returns (bool);

    function setBalance(address _to, uint256 _value) external;

    /* Send some of your tokens to a given address */
    function transfer(address _from, address _to, uint256 _value) public returns(bool success);

    /* Allow another contract or person to spend some tokens in your behalf */
    function approve(address _sender, address _spender, uint256 _value) public returns(bool success);

    /* A contract or  person attempts to get the tokens of somebody else.
     *  This is only allowed if the token holder approved. */
    function transferWithAllowance(address _origin, address _from, address _to, uint256 _value)
    public returns(bool success);
}
/*
 Allows to recreate OptionToken contract on the same address.
 Just create new TokenHolders(OptionToken) and reinitiallize OptionToken using it's address
 */
function approve(address _sender, address _spender, uint256 _value) public returns(bool success);

/* Allow another contract or person to spend some tokens in your behalf */