function _buyTokens(address _beneficiary, uint256 _amount, string _investmentType) internal {
        _preValidatePurchase(_beneficiary, _amount);

        (uint256 tokensAmount, uint256 tokenBonus) = _getTokensAmount(_beneficiary, _amount);

        uint256 totalAmount = tokensAmount.add(tokenBonus);

        _processPurchase(_beneficiary, totalAmount);
        emit TokensPurchaseLog(_investmentType, _beneficiary, _amount, tokensAmount, tokenBonus);        
        
        _postPurchaseUpdate(_beneficiary, totalAmount);
    }