revamped API to allow for arbitrary filtering, via filter objects