package com.technophobia.substeps.util; import org.eclipse.core.runtime.CoreException; import com.technophobia.substeps.supplier.Callback1; import com.technophobia.substeps.supplier.Predicate; public class TemporaryModelEnhancer<Model> { private final Callback1<Model> enhancementCallback; private final Callback1<Model> detractionCallback; private final ModelOperation<Model> operation; private final Predicate<Model> enhancementRequiredPredicate; public TemporaryModelEnhancer(final Callback1<Model> enhancementCallback, final Callback1<Model> detractionCallback, final ModelOperation<Model> operation, final Predicate<Model> enhancementRequiredPredicate) { this.enhancementCallback = enhancementCallback; this.detractionCallback = detractionCallback; this.operation = operation; this.enhancementRequiredPredicate = enhancementRequiredPredicate; } public void doOperationFor(final Model model) throws CoreException { final boolean requireEnhancement = enhancementRequiredPredicate.forModel(model); if (requireEnhancement) { enhancementCallback.doCallback(model); } try { operation.doOperationOn(model); } finally { if (requireEnhancement) { detractionCallback.doCallback(model); } } } }