def CallFlow(self,
               flow_name=None,
               next_state=None,
               request_data=None,
               client_id=None,
               base_session_id=None,
               **kwargs):
    """Creates a new flow and send its responses to a state.

    This creates a new flow. The flow may send back many responses which will be
    queued by the framework until the flow terminates. The final status message
    will cause the entire transaction to be committed to the specified state.

    Args:
       flow_name: The name of the flow to invoke.
       next_state: The state in this flow, that responses to this message should
         go to.
       request_data: Any dict provided here will be available in the
         RequestState protobuf. The Responses object maintains a reference to
         this protobuf for use in the execution of the state method. (so you can
         access this data by responses.request). There is no format mandated on
         this data but it may be a serialized protobuf.
       client_id: If given, the flow is started for this client.
       base_session_id: A URN which will be used to build a URN.
       **kwargs: Arguments for the child flow.

    Returns:
       The URN of the child flow which was created.

    Raises:
       RuntimeError: In case of no cpu quota left to start more clients.
    """
    if data_store.RelationalDBEnabled():
      if request_data is not None:
        raise ValueError("Hunt's CallFlow does not support 'request_data' arg "
                         "when REL_DB is enabled.")

      return self._CallFlowRelational(
          flow_name=flow_name, client_id=client_id, **kwargs)
    else:
      return self._CallFlowLegacy(
          flow_name=flow_name,
          next_state=next_state,
          request_data=request_data,
          client_id=client_id,
          base_session_id=base_session_id,
          **kwargs)