package net.hamnaberg.json.extension;
import net.hamnaberg.json.Json;
public abstract class Extended<T> {
protected final Json.JObject delegate;
protected Extended(Json.JObject delegate) {
this.delegate = delegate;
}
protected abstract T copy(Json.JObject value);
public <A> A getExtension(Extension<A> extension) {
return extension.extract(delegate);
}
@SuppressWarnings("unchecked")
public <A> T apply(A value, Extension<A> extension) {
Json.JObject applied = extension.apply(value);
if (applied == null || applied.isEmpty()) {
return (T)this;
}
return copy(delegate.concat(applied));
}
public Json.JObject asJson() {
return delegate;
}
protected String getAsString(String name) {
return delegate.getAsString(name).getOrElse((String)null);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Extended extended = (Extended) o;
if (delegate != null ? !delegate.equals(extended.delegate) : extended.delegate != null) return false;
return true;
}
@Override
public int hashCode() {
return delegate != null ? delegate.hashCode() : 0;
}
public abstract void validate();
}