base viewmodel implementation