construct based on value type