package ring.magic; import java.util.List; public abstract class AbstractMagicSystem<M extends SpellMetadataImplementation> implements MagicSystem<M> { private SpellCaster caster; @Override public SpellCaster getSpellCaster() { return caster; } @Override public void setSpellCaster(SpellCaster caster) { if (isCompatibleWith(caster)) { this.caster = caster; } else { //TODO throw exception } } @Override public abstract boolean isCompatibleWith(SpellCaster caster); @Override public abstract List<Spell> getSpells(); @Override public abstract void addSpell(Spell spell); @Override public abstract boolean canCast(Spell spell); @Override public abstract List<Spell> getCastableSpells(); @Override public abstract M getMetadata(Spell spell); @Override public abstract void refreshSpells(); @Override public abstract void refreshSpells(int amount); @Override public abstract void removeSpell(Spell spell); @Override public abstract void setSpells(List<Spell> spells); @Override public abstract void spellCast(Spell spell); @Override public abstract void spellFizzled(Spell spell); }