class_docstr: Metaclass that determines which callbacks should be inherited by an Experiment in order to
  complete its functionality
docstr: Store necessary instance-wide callbacks to :attr:`__instance_bases`, sort all dynamically
  added callback base classes, then add them to the instance
docstr_tok: ["Store","necessary","instance-wide","callbacks","to",":","attr",":","`","__instance_bases","`",",","sort","all","dynamically","added","callback","base","classes",",","then","add","them","to","the","instance"]
code: def __call__(cls, *args, **kwargs):
      """Store necessary instance-wide callbacks to :attr:`__instance_bases`, sort all dynamically
      added callback base classes, then add them to the instance"""
      original_bases = getattr(cls, "__original_bases")
      class_wide_bases = getattr(cls, "__class_wide_bases")
      instance_bases = []
  
      # Get source_script for use by Experiment later
      setattr(
          cls,
          "source_script",
          abspath(getframeinfo(currentframe().f_back)[0]),
      )
  
      # TODO: Should target wranglers addition be contingent on `kwargs["feature_engineer"].steps
  
      # Add callbacks explicitly supplied on class initialization
      if kwargs.get("callbacks", None) is not None:
          try:
              for callback in kwargs["callbacks"]:
                  instance_bases.append(callback)
          except TypeError:
              instance_bases.append(kwargs["callbacks"])
  
      # Infer necessary callbacks based on class initialization inputs
      if G.Env.holdout_dataset is not None:
          instance_bases.append(WranglerInputHoldout)
          instance_bases.append(WranglerTargetHoldout)
          instance_bases.append(PredictorHoldout)
          instance_bases.append(EvaluatorHoldout)
  
      if G.Env.test_dataset is not None:
          instance_bases.append(WranglerInputTest)
          instance_bases.append(PredictorTest)
  
      # Add callbacks explicitly provided to the Environment
      if len(G.Env.experiment_callbacks) > 0:
          instance_bases.extend(G.Env.experiment_callbacks)
  
      setattr(cls, "__instance_bases", instance_bases)
  
      # Sort dynamically added auxiliary base classes
      auxiliary_bases = tuple(
          base_callback_class_sorter(
              (class_wide_bases + instance_bases)
          )
      )
  
      # TODO: If "G.Env.save_full_predictions is True", add callbacks to record full_predictions for the 3 dataset types
      # FLAG: Ensure callbacks to record full_predictions are executed after normal "Predictor..." callbacks
      # FLAG: Add ability to record full_predictions, then provide callback to check on experiment end...
      # FLAG: ... to determine whether full_predictions should actually be saved - Like checking final score/std > threshold
  
      setattr(
          cls, "__priority_callback_bases", list(G.priority_callbacks)
      )
      cls.__bases__ = (
          G.priority_callbacks + original_bases + auxiliary_bases
      )
  
      return super().__call__(*args, **kwargs)
  
file_path: hyperparameter_hunter/hyperparameter_hunter/experiment_core.py
imports: from hyperparameter_hunter.callbacks.aggregators import AggregatorEvaluations, AggregatorTimes
  from hyperparameter_hunter.callbacks.bases import BaseCallback, BaseInputWranglerCallback, BaseTargetWranglerCallback, BasePredictorCallback, BaseWranglerCallback, BaseEvaluatorCallback, BaseAggregatorCallback, BaseLoggerCallback
  from hyperparameter_hunter.callbacks.evaluators import EvaluatorOOF, EvaluatorHoldout
  from hyperparameter_hunter.callbacks.loggers import LoggerFitStatus
  from hyperparameter_hunter.callbacks.wranglers.input_wranglers import WranglerInputTrain, WranglerInputOOF, WranglerInputHoldout, WranglerInputTest
  from hyperparameter_hunter.callbacks.wranglers.predictors import PredictorOOF, PredictorHoldout, PredictorTest
  from hyperparameter_hunter.callbacks.wranglers.target_wranglers import WranglerTargetTrain, WranglerTargetOOF, WranglerTargetHoldout
  from hyperparameter_hunter.settings import G
  from inspect import currentframe, getframeinfo
  from os.path import abspath
label_desc: Use image node_id 3 for calling the ExperimentMeta obj's underlying member method code with example usage: obj.__call__(cls) and returns: super