protocols memoizes an empty hash if non are defined, so it will never be nil.