docs: def save_state_recursively(state, base_path, parent_path, as_copy=False):
      """Recursively saves a state to a json file
  
      It calls this method on all its substates.
  
      :param state: State to be stored
      :param base_path: Path to the state machine
      :param parent_path: Path to the parent state
      :param bool as_copy: Temporary storage flag to signal that the given path is not the new file_system_path
      :return:
      """
      from rafcon.core.states.execution_state import ExecutionState
      from rafcon.core.states.container_state import ContainerState
  
      state_path = os.path.join(parent_path, get_storage_id_for_state(state))
      state_path_full = os.path.join(base_path, state_path)
      if not os.path.exists(state_path_full):
          os.makedirs(state_path_full)
  
      storage_utils.write_dict_to_json(state, os.path.join(state_path_full, FILE_NAME_CORE_DATA))
      if not as_copy:
          state.file_system_path = state_path_full
  
      if isinstance(state, ExecutionState):
          save_script_file_for_state_and_source_path(state, state_path_full, as_copy)
  
      save_semantic_data_for_state(state, state_path_full)
  
      # create yaml files for all children
      if isinstance(state, ContainerState):
          remove_obsolete_folders(state.states.values(), os.path.join(base_path, state_path))
          for state in state.states.values():
              save_state_recursively(state, base_path, state_path, as_copy)