# EmbeddableMapping.java

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

    import java.util.Map;

    import org.codefilarete.reflection.ReversibleAccessor;
    import org.codefilarete.reflection.ValueAccessPointMap;
    import org.codefilarete.stalactite.sql.ddl.structure.Column;
    import org.codefilarete.stalactite.sql.ddl.structure.Table;
    import org.codefilarete.tool.collection.KeepOrderMap;
    import org.codefilarete.tool.function.Converter;

    /**
     * Resulting class of {@link EmbeddableMappingBuilder#build()} process
     *
     * @param <C>
     * @param <T>
     */
    public class EmbeddableMapping<C, T extends Table<T>> {

    	// We keep the order of user definition because in the particular case of composite key definition, it helps to have stable tests
    	// However, at runtime, i'm not sure about the interest of it, except for the foreign key and its associated index impact. So it may be
    	// better to keep it as well, to let user has a way to define its column order.... even if it's tied to the order of its own line of code (DSL usage)
    	private final Map<ReversibleAccessor<C, Object>, Column<T, Object>> mapping = new KeepOrderMap<>();

    	private final Map<ReversibleAccessor<C, Object>, Column<T, Object>> readonlyMapping = new KeepOrderMap<>();

    	private final ValueAccessPointMap<C, Converter<Object, Object>> readConverters = new ValueAccessPointMap<>();

    	private final ValueAccessPointMap<C, Converter<Object, Object>> writeConverters = new ValueAccessPointMap<>();

    	/**
    	 * @return mapped properties
    	 */
    	public Map<ReversibleAccessor<C, Object>, Column<T, Object>> getMapping() {
    		return mapping;
    	}

    	/**
    	 * @return mapped readonly properties
    	 */
    	public Map<ReversibleAccessor<C, Object>, Column<T, Object>> getReadonlyMapping() {
    		return readonlyMapping;
    	}

    	public ValueAccessPointMap<C, Converter<Object, Object>> getReadConverters() {
    		return readConverters;
    	}

    	public ValueAccessPointMap<C, Converter<Object, Object>> getWriteConverters() {
    		return writeConverters;
    	}
    }