broke out the implementations of filter into seperate classes