contract ProductProtocolToken is StandardBurnableToken, ERC223Mixin, RBACERC223TokenFinalization, RBACMintableTokenMixin {
  /// @notice Constant field with token full name
  // solium-disable-next-line uppercase
  string constant public name = "Product Protocol"; 
  /// @notice Constant field with token symbol
  string constant public symbol = "PPO"; // solium-disable-line uppercase
  /// @notice Constant field with token precision depth
  uint256 constant public decimals = 18; // solium-disable-line uppercase
  /// @notice Constant field with token cap (total supply limit)
  uint256 constant public cap = 40 * (10 ** 9) * (10 ** decimals); // solium-disable-line uppercase

  /// @notice Overrides original mint function from MintableToken to limit minting over cap
  /// @param _to The address that will receive the minted tokens.
  /// @param _amount The amount of tokens to mint.
  /// @return A boolean that indicates if the operation was successful.
  function mint(
    address _to,
    uint256 _amount
  )
    public
    returns (bool) 
  {
    require(totalIssued_.add(_amount) <= cap, "Cap reached");
    return super.mint(_to, _amount);
  }

  /// @notice Overrides finalize function from RBACERC223TokenFinalization to prevent future minting after finalization
  /// @return A boolean that indicates if the operation was successful.
  function finalize() public returns (bool) {
    require(super.finalize());
    require(finishMinting());
    return true;
  }

  /// @notice Overrides finishMinting function from RBACMintableTokenMixin to prevent finishing minting before finalization
  /// @return A boolean that indicates if the operation was successful.
  function finishMinting() internal returns (bool) {
    require(finalized == true);
    require(super.finishMinting());
    return true;
  }
}
/// @title Product Protocol token implementation
/// @dev Implements ERC20, ERC223 and MintableToken interfaces
function finishMinting() internal returns (bool) {
  require(finalized == true);
  require(super.finishMinting());
  return true;
}

/// @notice Overrides finishMinting function from RBACMintableTokenMixin to prevent finishing minting before finalization
/// @return A boolean that indicates if the operation was successful.