now with more generalized methods