more generalization, not quite there