change DataReader to use visitor pattern