code: def register_value_producer(self, value_name: str, source: Callable[..., pd.DataFrame]=None,
                                  preferred_combiner: Callable=replace_combiner,
                                  preferred_post_processor: Callable[..., pd.DataFrame]=None) -> Pipeline:
          
          return self._value_manager.register_value_producer(value_name, source,
                                                             preferred_combiner,
                                                             preferred_post_processor)
docs: Marks a ``Callable`` as the producer of a named value.
  
          Parameters
          ----------
          value_name :
              The name of the new dynamic value pipeline.
          source :
              A callable source for the dynamic value pipeline.
          preferred_combiner :
              A strategy for combining the source and the results of any calls to mutators in the pipeline.
              ``vivarium`` provides the strategies ``replace_combiner`` (the default), ``list_combiner``,
              and ``set_combiner`` which are importable from ``vivarium.framework.values``.  Client code
              may define additional strategies as necessary.
          preferred_post_processor :
              A strategy for processing the final output of the pipeline. ``vivarium`` provides the strategies
              ``rescale_post_processor`` and ``joint_value_post_processor`` which are importable from
              ``vivarium.framework.values``.  Client code may define additional strategies as necessary.
  
          Returns
          -------
          Callable
              A callable reference to the named dynamic value pipeline.