Make GeneralCast the center of casting logic