A variant of XML / JSON.
Thanks to a `Consumer<Entity>` interface, implementation of the features themselves can be done in a method that returns a `Consumer<Entity>`, this method can take some parameters for the details themselves, so a card could be for example the following: (this will be the same card as in my previous XML/JSON answer)
The ability is "At the end of your turn, deal 2 damage to a random enemy B0T"
<card>
<name>Super Card</name>
<description>Some interesting text</description>
<abilities>
<ability method="Triggers.atEndOfTurn">
<parameter method="Effects.damageToTarget">
<parameter>2</parameter>
<parameter method="toRandom">
<parameter method="Filters.and">
<parameter method="Filters.isEnemy" />
<parameter method="Filters.isCreatureType">
<parameter>B0T</parameter>
</parameter>
</parameter>
</parameter>
</parameter>
</ability>
</abilities>
The following methods would then be used:
Consumer<Entity> atEndOfTurn(Consumer<Entity> effect);
Consumer<Entity> damagetoTarget(int damage, BiPredicate<Entity, Entity> filter);
BiPredicate<Entity, Entity> and(BiPredicate<Entity, Entity> filter1, BiPredicate<Entity, Entity> filter2);
BiPredicate<Entity, Entity> isEnemy();
BiPredicate<Entity, Entity> isCreatureType(String creatureType);
Then these parameters and methods are used using reflection.
Or, if you would make one method to do everything, simply:
<card>
<name>Super Card</name>
<description>Some interesting text</description>
<abilities>
<ability method="deal2damageToRandomEnemyBotAtEndOfTurn" />
</abilities>
</card>