contract CappedCrowdsale is Crowdsale {
    using SafeMath for uint256;

    uint256 public cap;

    constructor(uint256 _cap) public {
        require(_cap > 0);
        cap = _cap;
    }

    // overriding Crowdsale#validPurchase to add extra cap logic
    // @return true if investors can buy at the moment
    function validPurchase() internal view returns (bool) {
        return super.validPurchase() && weiRaised.add(msg.value) <= cap;
    }

    // overriding Crowdsale#hasEnded to add cap logic
    // @return true if crowdsale event has ended
    function hasEnded() public view returns (bool) {
        return super.hasEnded() || weiRaised >= cap;
    }
}
function validPurchase() internal view returns (bool) {
    return super.validPurchase() && weiRaised.add(msg.value) <= cap;
}

// overriding Crowdsale#validPurchase to add extra cap logic
// @return true if investors can buy at the moment