function to call the `tokenFallback` if the tokens
   * @dev recepient is the smart-contract. If the contract doesn't implement
   * @dev this function transaction fails
   * @param _from address the tokens owner
   * @param _to address the tokens recepient (perhaps the contract)
   * @param _value uint amount of the tokens to be transferred
   * @param _data bytes metadata
   */
  function _safeTransfer(
    address _from,
    address _to,
    uint _value,
    bytes _data
  )
    internal
  {
    if (_to.isContract()) {
      IERC223BasicReceiver receiver = IERC223BasicReceiver(_to);
      receiver.tokenFallback(_from, _value, _data);
    }
  }