private void ProcessCoroutine(EditorCoroutine routine)
        {
            if (routine._currentYieldingCoro != null)
            {
                ProcessCoroutine(routine._currentYieldingCoro);
                if (routine._currentYieldingCoro.didBreak) // Inner coro is done
                {
                    routine._currentYieldingCoro = null;
                }

                return;
            }

            if (routine._currentYieldingAsyncOperation != null)
            {
                if (routine._currentYieldingAsyncOperation.isDone) // Yilding operation is done
                {
                    routine._currentYieldingAsyncOperation = null;
                }
                return;
            }

            if (routine._startedWaiting != default(DateTime))
            {
                var now = DateTime.UtcNow;
                if (now >= routine._startedWaiting + TimeSpan.FromSeconds(routine._waitingSeconds))
                {
                    routine._startedWaiting = default(DateTime);
                    routine._waitingSeconds = 0;
                }
                return;
            }

            if (routine.MoveNext())
            {
                var current = routine.Current;

                if (current is EditorCoroutine)
                {
                    routine._currentYieldingCoro = (EditorCoroutine)current;
                }
                else if (current is AsyncOperation)
                {
                    routine._currentYieldingAsyncOperation = (AsyncOperation)current;
                }
                else if (current is WaitForSeconds)
                {
                    routine._startedWaiting = DateTime.UtcNow;
                    routine._waitingSeconds = float.Parse(GetInstanceField(typeof(WaitForSeconds), current, "m_Seconds").ToString());
                }
                else if (current == null || current is int || current is bool)
                {
                    // Do nothing. Standard yield return null or something like that
                }
                else if (current is UnityEngine.Coroutine)
                {
                    throw new Exception("Editor coroutine yielded UnityEngine.Coroutine. Use MonoBehaviorExtended.StartCoroutine instead of UnityEngine.StartCoroutine");
                }
                else
                {
                    throw new Exception("Unknown type of yielded object: " + current.GetType());
                }
            }
            else
            {
                routine.didBreak = true;
            }
        }