cleaned things up a lot using java lambas and default interface methods.