BuildStatus buildCore(BuildRequest request, CancellationToken cancellation, BuildParameters parameters)
		{
			using (measureBlock("build time"))
			using (beginBuild(BuildManager, parameters))
			using (cancellation.Register(() =>
			{
				Log.I("cancelling background build");
				BuildManager.CancelAllSubmissions();
			}))
			{
				var projects = request.AllProjectsToBuildOrdered;
				
				foreach (var project in projects)
				{
					if (cancellation.IsCancellationRequested)
						return BuildStatus.Indeterminate;

					if (request.mustBeSkipped(project))
					{
						notifyProjectSkipped(project);
						continue;
					}

					var buildData = request.createBuildRequestData(project);
					var result = BuildManager.BuildRequest(buildData);
					switch (result.OverallResult)
					{
						case BuildResultCode.Success:
							continue;
						case BuildResultCode.Failure:
							return BuildStatus.Failed;
						default:
							throw new ArgumentOutOfRangeException();
					}
				}

				return BuildStatus.Ok;
			}
		}