ConvertedActivity ConvertSingleActivityToContinuation(
            SingleActivity singleActivity,
            Job parent,
            ExceptionFilter[] inheritedExceptionFilters)
        {
            var job = new Job(Guid.NewGuid(),
                singleActivity.Type,
                singleActivity.Name,
                singleActivity.Arguments,
                _now(),
                rootId: parent.RootId,
                parentId: parent.Id,
                status: JobStatus.Created,
                exceptionFilters: inheritedExceptionFilters.Concat(singleActivity.ExceptionFilters).ToArray());

            var jobs = new List<Job>(new[] {job});

            var continuation = new Continuation
            {
                Id = job.Id,
                Type = ContinuationType.Single,
                ContinueAfterHandlingFailure = singleActivity.CanContinueAfterHandlingFailure
            };

            var onNext = ConvertCore(singleActivity.Next, parent, inheritedExceptionFilters);
            continuation.Next = onNext.Continuation;
            jobs.AddRange(onNext.Jobs);

            var onFailed = ConvertCore(singleActivity.OnFailed, parent, inheritedExceptionFilters);
            continuation.OnAllFailed = onFailed.Continuation;
            jobs.AddRange(onFailed.Jobs);

            var onCancel = ConvertCore(singleActivity.OnCancel, parent, inheritedExceptionFilters);
            if (onCancel.Continuation != null)
                onCancel.Continuation.CompensateForCancellation = true;
            continuation.OnCancelled = onCancel.Continuation;
            jobs.AddRange(onCancel.Jobs);

            return new ConvertedActivity(continuation, jobs.AsEnumerable());
        }