private boolean hasDBT(IGenericCharacter character) {
   for (IMagic magic : character.getAllLearnedMagic()) {
     if (magic instanceof ICharm && magic.getId().equals("Lunar.DeadlyBeastmanTransformation")) {
       return true;
     }
   }
   return false;
 }
  @Override
  public boolean isAllowedFor(final IGenericTraitCollection traitCollection, IMagic magic) {
    final boolean[] isAllowed = new boolean[1];
    magic.accept(
        new IMagicVisitor() {
          @Override
          public void visitSpell(ISpell spell) {
            CircleType type = spell.getCircleType();
            if (isSpellCircleGreaterThanMaximumCircle(type)
                || isBackgroundValueLessThanMinimumValueForCircle(traitCollection, type)) {
              isAllowed[0] = false;
              return;
            }
            if (exceptionIds.contains(spell.getId())) {
              isAllowed[0] = !defaultResponse;
            } else {
              isAllowed[0] = defaultResponse;
            }
          }

          @Override
          public void visitCharm(ICharm charm) {
            isAllowed[0] = false;
          }
        });
    return isAllowed[0];
  }
  public int getMagicCosts(IMagic magic, final ICostAnalyzer analyzer) {
    final int[] cost = new int[1];
    magic.accept(
        new IMagicVisitor() {
          public void visitCharm(ICharm charm) {
            cost[0] = getCharmCosts(charm, analyzer);
          }

          public void visitSpell(ISpell spell) {
            cost[0] = getSpellCosts(analyzer);
          }
        });
    return cost[0];
  }