code: def _call_member(obj, name, failfast=True, *args, **kwargs):
      
      try:
          attr = getattr(obj, name)
      except AttributeError as e:
          if failfast:
              raise e
          else:
              return None
      try:
          if inspect.ismethod(attr):  # call function
              return attr(*args, **kwargs)
          elif isinstance(attr, property):  # call property
                  return obj.attr
          else:  # now it's an Attribute, so we can just return its value
              return attr
      except Exception as e:
          if failfast:
              raise e
          else:
              return None
docs: Calls the specified method, property or attribute of the given object
  
      Parameters
      ----------
      obj : object
          The object that will be used
      name : str
          Name of method, property or attribute
      failfast : bool
          If True, will raise an exception when trying a method that doesn't exist. If False, will simply return None
          in that case
      args : list, optional, default=[]
          Arguments to be passed to the method (if any)
  
      kwargs: dict