Edge cases in the API (can pass null etc) and throwing an exception on programming errors are smells for me. I would model it this way:
oathContract = power.witnessOath(declaration, curse);
or in the case of a Christian power (which ISA Jewish power too): oathContract = christianPower.witnessOath(declaration);
It's just not the same interface. You can't realistically ignore the type of power and use a polymorphic call. The Bible says so.
(Of course, when you oathContract.renege(), we know which power should handle your case, and can put a message in their respective queue)