change to delegate, add abstract protocol