# AbstractIdentificationStep.java

    package org.codefilarete.stalactite.engine.configurer.builder;

    import java.lang.reflect.Method;

    import org.codefilarete.reflection.MethodReferenceCapturer;
    import org.codefilarete.reflection.SerializablePropertyMutator;
    import org.codefilarete.stalactite.dsl.entity.FluentEntityMappingBuilder;
    import org.codefilarete.stalactite.dsl.idpolicy.IdentifierPolicy;
    import org.codefilarete.stalactite.dsl.key.FluentEntityMappingBuilderKeyOptions;
    import org.codefilarete.tool.Reflections;
    import org.codefilarete.tool.function.SerializableTriFunction;

    public class AbstractIdentificationStep<C, I> {

    	private final MethodReferenceCapturer methodSpy;

    	public AbstractIdentificationStep() {
    		this.methodSpy = new MethodReferenceCapturer();
    	}

    	protected UnsupportedOperationException newMissingIdentificationException(Class<C> entityType) {
    		SerializableTriFunction<FluentEntityMappingBuilder, SerializablePropertyMutator<C, I>, IdentifierPolicy, FluentEntityMappingBuilderKeyOptions<C, I>>
    				identifierMethodReference = FluentEntityMappingBuilder::mapKey;
    		Method identifierSetter = this.methodSpy.findMethod(identifierMethodReference);
    		return new UnsupportedOperationException("Identifier is not defined for " + Reflections.toString(entityType)
    				+ ", please add one through " + Reflections.toString(identifierSetter));
    	}
    }