package com.codepoetics.phantompojo;
import com.codepoetics.phantompojo.impl.PhantomBuilderClassPair;
import com.codepoetics.phantompojo.impl.PropertySchema;
import com.codepoetics.phantompojo.impl.PropertyStore;
import java.util.Map;
import java.util.function.Supplier;
public interface PhantomPojo<B extends Supplier<? extends PhantomPojo<?>>> {
interface PropertiesCapture {
<P extends PhantomPojo<B>, B extends Supplier<P>> P with(Class<? extends P> klass);
}
static PropertiesCapture wrapping(Map<String, Object> properties) {
return new PropertiesCapture() {
@Override
public <P extends PhantomPojo<B>, B extends Supplier<P>> P with(Class<? extends P> klass) {
PhantomBuilderClassPair<P, B> classPair = PhantomBuilderClassPair.forPhantomClass(klass);
PropertySchema schema = classPair.getPropertySchema();
PropertyStore store = schema.createStoreFromMap(properties, PojoPromoter::promote);
return classPair.createPhantom(store);
}
};
}
B update();
Map<String, Object> properties();
}