The act of calling doFilter seems to call the next one in the series. Does that mean we get called back before ultimately deciding on whether to do the next one or not? Wouldn't it be better to have a filter method which returned a true/false to say whether it's worth calling the next one or not, and explicitly having a while(filter()) call somewhere to process them all, rather than a mutating state?