 		func handleResult(_ getStage: () throws -> Self) {
 			do {
 				let nextStage = try getStage()
-				run(nextStage)
+				progress(nextStage)
+				process(nextStage)
 			}
 			catch let error {
 				complete{ throw error }
 			}
 		}
 		
-		func run(_ stage: Self) {
+		func process(_ stage: Self) {
 			environment.service(for: stage).async {
 				if environment.shouldStop(stage) {
 					complete{ throw EnvironmentError.stopped }


extension StageProtocol {
	public func execute(
    environment: Environment,
    completionService: ServiceProtocol?,
    completion: @escaping (@escaping () throws -> Result) -> ()
    )
	{
		func complete(_ useResult: (@escaping () throws -> Result)) {
			if let completionService = completionService {
				completionService.async{


extension StageProtocol {
	public func compose
		<Other>(
		transformNext: @escaping (Self) throws -> Other,
		transformResult: (Result) -> Deferred<Other>
		) -> Deferred<Other>
	{
		if let result = result {
			return transformResult(result)
