second strike, big refactoring, going for a protocol approach