package org.atomnuke.atom.model.builder; import java.net.URI; import org.atomnuke.atom.model.AtomCommonAtributes; /** * * @author zinic */ public abstract class AtomConstructBuilderImpl<T extends AtomConstructBuilder, B extends AtomCommonAtributes, C extends AtomCommonAttributesImpl> implements AtomConstructBuilder<T, B> { private final Class<T> builderType; private final C atomConstruct; protected AtomConstructBuilderImpl(Class<T> builderType, C atomConstruct) { this.atomConstruct = atomConstruct; this.builderType = builderType; } protected AtomConstructBuilderImpl(Class<T> builderType, C atomConstruct, B copyConstruct) { this.atomConstruct = atomConstruct; this.builderType = builderType; if (copyConstruct != null) { if (copyConstruct.base() != null) { setBase(copyConstruct.base()); } if (copyConstruct.lang() != null) { setLang(copyConstruct.lang()); } } } protected final T builder() { return builderType.cast(this); } protected final C construct() { return atomConstruct; } @Override public final B build() { return (B) construct(); } @Override public final T setBase(URI base) { construct().setBase(base); return builder(); } @Override public final T setLang(String lang) { construct().setLang(lang); return builder(); } }