The perform_x functions mostly duplicate each other's behavior in one way or the other. Ideally, only thing that should be necessary to add a new ability to the game should be specifying the data as an Ability.
The current spec for Ability should come close to being sufficient as a model for a single perform_ability function.