Refactor to split base implementation from interface