Base implementation

I still disagree with `protected` here