sorry too many if checks here, why `payment.complete?` twice?, makes me wonder if we really need to isolate that `payment.process!` into its own method.