factored out Groupoid