docs: def Enumerate():
      """See base class."""
      # Init a HID manager
      hid_mgr = iokit.IOHIDManagerCreate(None, None)
      if not hid_mgr:
        raise errors.OsHidError('Unable to obtain HID manager reference')
      iokit.IOHIDManagerSetDeviceMatching(hid_mgr, None)
  
      # Get devices from HID manager
      device_set_ref = iokit.IOHIDManagerCopyDevices(hid_mgr)
      if not device_set_ref:
        raise errors.OsHidError('Failed to obtain devices from HID manager')
  
      num = iokit.CFSetGetCount(device_set_ref)
      devices = (IO_HID_DEVICE_REF * num)()
      iokit.CFSetGetValues(device_set_ref, devices)
  
      # Retrieve and build descriptor dictionaries for each device
      descriptors = []
      for dev in devices:
        d = base.DeviceDescriptor()
        d.vendor_id = GetDeviceIntProperty(dev, HID_DEVICE_PROPERTY_VENDOR_ID)
        d.product_id = GetDeviceIntProperty(dev, HID_DEVICE_PROPERTY_PRODUCT_ID)
        d.product_string = GetDeviceStringProperty(dev,
                                                   HID_DEVICE_PROPERTY_PRODUCT)
        d.usage = GetDeviceIntProperty(dev, HID_DEVICE_PROPERTY_PRIMARY_USAGE)
        d.usage_page = GetDeviceIntProperty(
            dev, HID_DEVICE_PROPERTY_PRIMARY_USAGE_PAGE)
        d.report_id = GetDeviceIntProperty(dev, HID_DEVICE_PROPERTY_REPORT_ID)
        d.path = GetDevicePath(dev)
        descriptors.append(d.ToPublicDict())
  
      # Clean up CF objects
      cf.CFRelease(device_set_ref)
      cf.CFRelease(hid_mgr)
  
      return descriptors