implement virtual callback