package org.leumasjaffe.charsheet.model.features; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; import lombok.AllArgsConstructor; @JsonTypeInfo(use=Id.NAME) @JsonSubTypes({ @Type(name="Simple", value=DDProperty.Simple.class), @Type(name="Flat", value=DDProperty.Flat.class), @Type(name="SpellLevel", value=DDProperty.PerSpellLevel.class) }) public interface DDProperty { public enum Group { NONE } boolean appliesTo(String key); T value(); @AllArgsConstructor public class Simple implements DDProperty { String name; @Override public boolean appliesTo(String key) { return false; } @Override public T value() { return null; } } @AllArgsConstructor public static class Flat implements DDProperty { String applies; Group group; int value; @Override public boolean appliesTo(String key) { return applies.equals(key); } @SuppressWarnings("unchecked") @Override public Object value() { return this.value; } } @AllArgsConstructor public static class PerSpellLevel implements DDProperty { String applies; Group group; int value; @Override public boolean appliesTo(String key) { return applies.equals(key); } @SuppressWarnings("unchecked") @Override public Object value() { return this.value; // TODO consume spell level information } } }