(1) We should write a new protocol that our base class and additional (sub) classes will implement. This protocol should define a set of required methods and properties for each accessible type, and a set of optional methods and properties that accessibles may implement as needed to communicate which selectors/attributes/actions, etc they support. This protocol should be named with the convention mozAccessibleProtocol, assuming our base class is still mozAccessible.
(2) Our base class should be the only class to implement NSAccessibilityProtocol from Apple. Subclasses should not talk to Apple directly, rather they should implement methods from mozAccessibleProtocol. Within the NSAccessibilityProtocol methods, mozAccessible will dispatch calls to the appropriate mozAccessibleProtocol methods by role or by class.
(3) Within the base class's accessibilityAttributeNames method, we should make sure we advertise attributes iff their selector is supported, and for each supported selector, we advertise its corresponding attribute. This probably means we'll need to steal the map between attrs/selectors from the test files and do some iteration here. Good thing is attributes should be static for each accessible type, so we won't have to do this very often.