docs: def set_param_file_or_parameters(mcs, attr):
          """
          Set parameters from class attributes that are instances of
          :class:`~simkit.core.Parameter` or from a parameter file.
  
          Any class attributes that are instances of
          :class:`~simkit.core.Parameter` are popped from the class and added to
          a the ``parameters`` attribute, which is a dictionary of the parameters.
  
          :param attr: class attributes
          :return: new list of class attributes with parameters
          """
          meta = attr[mcs._meta_attr]  # look for parameter file path in meta
          cls_path = getattr(meta, mcs._path_attr, None)
          cls_file = getattr(meta, mcs._file_attr, None)
          # read parameters
          attr[mcs._param_attr] = {}
          attr[mcs._param_file] = None
          # read parameters from file
          if None not in [cls_path, cls_file]:
              param_file = os.path.join(cls_path, cls_file)
              attr[mcs._param_file] = param_file
              # read and load JSON parameter map file as "parameters"
              with open(param_file, 'r') as param_file:
                  file_params = json.load(param_file)
              # update meta from file
              for k, v in file_params.pop(mcs._meta_cls, {}).iteritems():
                  setattr(meta, k, v)
              # dictionary of parameters for reading source file
              attr[mcs._param_attr] = {
                  k: mcs._param_cls(**v) for k, v in file_params.iteritems()
              }
          # get parameters from class
          parameters = dict.fromkeys(
              k for k, v in attr.iteritems() if isinstance(v, Parameter)
          )
          # update parameters
          for k in parameters:
              attr[mcs._param_attr][k] = attr.pop(k)
          return attr