@protected T get value { reportRead(); return _value as T; }
@protected set value(T newValue) { if (_value == newValue) return; _value = newValue; refresh(); }