second virgin: separete defining and making the generic function