package mage.utils; import java.util.ArrayList; import java.util.function.Consumer; import java.util.function.Supplier; public abstract class FluentBuilder> { final ArrayList> buildSequence; private final Supplier newReference; protected FluentBuilder(Supplier newReference) { this.buildSequence = new ArrayList<>(); this.newReference = newReference; } private RealBuilder copy() { final RealBuilder realBuilder = newReference.get(); realBuilder.buildSequence.addAll(buildSequence); return realBuilder; } protected abstract ToBuild makeValue(); public RealBuilder with(Consumer consumer) { final RealBuilder nextBuilder = this.copy(); nextBuilder.buildSequence.add(consumer); return nextBuilder; } public ToBuild build() { final RealBuilder instance = this.copy(); instance.buildSequence.forEach(c -> c.accept(instance)); return instance.makeValue(); } }