decided to go with traditional generic instead of meta programming