code: def map_symbol(self, func_name, restype=None, argtypes=(), errcheck=None):
          
          if (argtypes):
              prototype = self.function_type(restype, *argtypes)
          else:
              prototype = self.function_type(restype)
          try:
              symbol = prototype((func_name, self))
          except AttributeError:
              raise ImportError("Could not map function '{}' from library {}".format(func_name, self._name))
  
          setattr(symbol, "_name", func_name)
          log.debug('Wrapped function "{}", result type: {}, error_check {}'.format(func_name, type(restype), errcheck))
  
          if (errcheck):
              symbol.errcheck = errcheck
  
          setattr(self, func_name, symbol)
          return symbol
docs: Map and return a symbol (function) from a C library. A reference to the
          mapped symbol is also held in the instance
  
          :param str func_name:
              symbol_name
          :param ctypes.c_* restype:
              function result type (i.e. ctypes.c_ulong...), defaults to void
          :param tuple(ctypes.c_* ... ) argtypes:
              argument types, defaults to no args
          :param callable errcheck:
              optional error checking function, see ctypes docs for _FuncPtr