class Recognito {

    public VoicePrint mergeVoiceSample(K userKey, double[] voiceSample) {
        
        if(userKey == null) {
            throw new NullPointerException("The userKey is null");
        }
        
        VoicePrint original = store.get(userKey);
        if(original == null) {
            throw new IllegalArgumentException("No voice print linked to this user key [" + userKey + "]");
        }

        double[] features = extractFeatures(voiceSample, sampleRate);
        synchronized (this) {
            if(!universalModelWasSetByUser.get()) {
                universalModel.merge(features);
            }
        }
        original.merge(features);
        
        return original;
    }

    public  Recognito(float sampleRate);
    public  Recognito(float sampleRate, Map<K, VoicePrint> voicePrintsByUserKey);

}