added virtual function