initialize needs to be a virtual function