class Recognito {

    public synchronized VoicePrint createVoicePrint(K userKey, double[] voiceSample) {
        if(userKey == null) {
            throw new NullPointerException("The userKey is null");
        }
        if(store.containsKey(userKey)) {
            throw new IllegalArgumentException("The userKey already exists: [" + userKey + "]");
        }
        
        double[] features = extractFeatures(voiceSample, sampleRate);
        VoicePrint voicePrint = new VoicePrint(features);
         
        synchronized (this) {
            if (!universalModelWasSetByUser.get()) {
                if (universalModel == null) {
                    universalModel = new VoicePrint(voicePrint);
                } else {
                    universalModel.merge(features);
                }
            }
        }
        store.put(userKey, voicePrint);
        
        return voicePrint;
    }

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

}