private StatusMetadata Evaluate( List <ICraftingStep> craftingSteps, StatusMetadata metadata) { foreach (var craftingStep in craftingSteps) { if (metadata.CurrentStatus.Completed) { return(metadata); } craftingStep.UpdateStatus(metadata.CurrentStatus); ItemStatus previousStatus = null; while (craftingStep.ShouldVisitChildren(previousStatus, metadata.CurrentStatus)) { previousStatus = (ItemStatus)metadata.CurrentStatus.Clone(); Evaluate(craftingStep.Children, metadata); metadata.CurrentStatus = ItemStatus.Combine(new List <ItemStatus> { previousStatus, metadata.CurrentStatus }); } metadata = UpdateMetadata(craftingStep, metadata); } return(metadata); }