def METHOD_NAME(self, m_array=None, forget=True, project=False):
    """ An implementation of the reduced functional derivative evaluation
        that accepts the controls as an array of scalars. If no control values are given,
        the result is derivative at the lastest forward run.
    """
    # In the case that the control values have changed since the last forward run,
    # we first need to rerun the forward model with the new controls to have the
    # correct forward solutions
    # TODO: No good way to check. Is it ok to always assume `m_array` is the same as used last in __call__?
    # if m_array is not None:
    #    self.__call__(m_array)
    dJdm = self.rf.METHOD_NAME()
    dJdm = Enlist(dJdm)
    m_global = []
    for i, control in enumerate(self.controls):
        # This is a little ugly, but we need to go through the control to get to the OverloadedType.
        # There is no guarantee that dJdm[i] is an OverloadedType and not a backend type.
        m_global += control.fetch_numpy(dJdm[i])
    return numpy.array(m_global, dtype="d")