contract Multivest is Ownable {
    /* public variables */
    mapping (address => bool) public allowedMultivests;

    /* events */
    event MultivestSet(address multivest);

    event MultivestUnset(address multivest);

    event Contribution(address _holder, uint256 tokens);

    modifier onlyAllowedMultivests(address _address) {
        require(true == allowedMultivests[_address]);
        _;
    }

    /* constructor */
    function Multivest(address _multivest) public {
        allowedMultivests[_multivest] = true;
    }

    /* public methods */
    function setAllowedMultivest(address _address) public onlyOwner {
        allowedMultivests[_address] = true;
    }

    function unsetAllowedMultivest(address _address) public onlyOwner {
        allowedMultivests[_address] = false;
    }

    function multivestBuy(
        address _address,
        uint256 _amount,
        uint256 _value
    ) public onlyAllowedMultivests(msg.sender) {
        bool status = buy(_address, _amount, _value);

        require(status == true);
    }

    function buy(address _address, uint256 _amount, uint256 _value) internal returns (bool);

}
function Multivest(address _multivest) public {
    allowedMultivests[_multivest] = true;
}

/* constructor */