reorganized as a more reusable component