code: def check_conditions(f, args, kwargs):
      
      member_function = is_member_function(f)
  
      # check the functions direct pre conditions
      check_preconditions(f, args, kwargs)
  
      # for member functions check the pre conditions up the chain
      base_classes = []
      if member_function:
          base_classes = inspect.getmro(type(args[0]))[1:-1]
          for clz in base_classes:
              super_fn = getattr(clz, f.func_name, None)
              check_preconditions(super_fn, args, kwargs)
  
      # run the real function
      return_value = f(*args, **kwargs)
  
      # check the functions direct post conditions
      check_postconditions(f, return_value)
  
      # for member functions check the post conditions up the chain
      if member_function:
          for clz in base_classes:
              super_fn = getattr(clz, f.func_name, None)
              check_postconditions(super_fn, return_value)
  
      return return_value
docs: This is what runs all of the conditions attached to a method,
      along with the conditions on the superclasses.