APVTS: Value returned by getParameterAsValue() breaks connection to the tree

Here’s a temporary fix that seems to work for our product. Instead of
treeState.getParameterAsValue(ID)
you would write
APVTSValueAdapter::getParameterAsValue(treeState, ID).
I would still prefer a true solution to this.

APVTSValueAdapter.h

#pragma once
#include "../JuceLibraryCode/JuceHeader.h"

class APVTSValueAdapter : public Value::ValueSource,
                          private RangedAudioParameter::Listener
{
public:
    APVTSValueAdapter(AudioProcessorValueTreeState& treeState, String parameterID);
    virtual ~APVTSValueAdapter();

    virtual var getValue() const override { return m_currentValue; }
    virtual void setValue(const var& newValue) override;

    static Value getParameterAsValue(AudioProcessorValueTreeState& treeState, String parameterID)
    {
        return juce::Value(static_cast<Value::ValueSource*>(new APVTSValueAdapter(treeState, parameterID)));
    }
private:
    virtual void parameterValueChanged(int parameterIndex, float newValue) override;
    virtual void parameterGestureChanged(int parameterIndex, bool gestureIsStarting) override {}

    RangedAudioParameter* m_parameter;
    float m_currentValue; // cached for speed. Required? Maybe not.
};

APVTSValueAdapter.cpp

#include "APVTSValueAdapter.h"

APVTSValueAdapter::APVTSValueAdapter(AudioProcessorValueTreeState& treeState, String parameterID)
{
    m_parameter = treeState.getParameter(parameterID);
    jassert(m_parameter);
    m_parameter->addListener(this);
    m_currentValue = m_parameter->convertFrom0to1(m_parameter->getValue());
}

APVTSValueAdapter::~APVTSValueAdapter()
{
    m_parameter->removeListener(this);
}

void APVTSValueAdapter::setValue(const var& newValue)
{
    m_parameter->setValueNotifyingHost(m_parameter->convertTo0to1(newValue));
}

void APVTSValueAdapter::parameterValueChanged(int parameterIndex, float newValue)
{
    m_currentValue = m_parameter->convertFrom0to1(newValue);
    sendChangeMessage(false);
}