Abstract implementation