docs: def extract_object_properties(self, o, limit_size=False):
          """Extracts all properties from an object (eg. f_locals, f_globals, 
          user dict, instance ...) and returns them as an array of variables.
          """
          try:
              prop_str = repr(o)[:512]
          except:
              prop_str = "Error while extracting value"
  
          _logger.e_debug("extract_object_properties(%s)", prop_str)
          var_list = []
          if isinstance(o, dict):
              a_var_name = None
              a_var_value = None
              for a_var_name in o:
                  a_var_value = o[a_var_name]
                  children_count = self.object_properties_count(a_var_value)
                  v_name, v_value, v_type = self.extract_name_value_type(a_var_name, 
                                                                         a_var_value, 
                                                                         limit_size=limit_size)
                  a_var_info = {
                      'id': id(a_var_value),
                      'name': v_name,
                      'type': "%s%s" % (v_type, " [%s]" % children_count if children_count else '',),
                      'value': v_value,
                      'children_count': children_count,
                  }
                  var_list.append(a_var_info)
                  
          elif type(o) in (list, tuple, set,):
              MAX_CHILDREN_TO_RETURN = 256
              MAX_CHILDREN_MESSAGE = "Truncated by ikpdb (don't hot change me !)."
              a_var_name = None
              a_var_value = None
              do_truncate = len(o) > MAX_CHILDREN_TO_RETURN
              for idx, a_var_value in enumerate(o):
                  children_count = self.object_properties_count(a_var_value)
                  v_name, v_value, v_type = self.extract_name_value_type(idx, 
                                                                         a_var_value, 
                                                                         limit_size=limit_size)
                  var_list.append({
                      'id': id(a_var_value),
                      'name': v_name,
                      'type': "%s%s" % (v_type, " [%s]" % children_count if children_count else '',),
                      'value': v_value,
                      'children_count': children_count,
                  })
                  if do_truncate and idx==MAX_CHILDREN_TO_RETURN-1:
                      var_list.append({
                          'id': None,
                          'name': str(MAX_CHILDREN_TO_RETURN),
                          'type': '',
                          'value': MAX_CHILDREN_MESSAGE,
                          'children_count': 0,
                      })
                      break
          else:
              a_var_name = None
              a_var_value = None
              if hasattr(o, '__dict__'):
                  for a_var_name, a_var_value in o.__dict__.items():
                      if (not a_var_name.startswith('__') 
                          and not type(a_var_value) in (types.ModuleType, 
                                                        types.MethodType, 
                                                        types.FunctionType,)):
                          children_count = self.object_properties_count(a_var_value)
                          v_name, v_value, v_type = self.extract_name_value_type(a_var_name,
                                                                                 a_var_value, 
                                                                                 limit_size=limit_size)
                          var_list.append({
                              'id': id(a_var_value),
                              'name': v_name,
                              'type': "%s%s" % (v_type, " [%s]" % children_count if children_count else '',),
                              'value': v_value,
                              'children_count': children_count,
                          })
          return var_list