Utilizzo una libreria di terze parti (clj-msgpack) e desidero estendere un protocollo per un tipo per il quale la libreria fornisce anche un gestore.Estensione di un protocollo fornito da libreria senza impatto sugli altri utenti
Di per sé, è abbastanza semplice, ma esiste un modo per farlo che non influenzi gli altri utenti di questa libreria in esecuzione nella stessa JVM? Qualcosa di simile a un vincolo di una variabile dinamica (che ha effetto solo sotto un determinato punto della pila) sarebbe l'ideale.
Allo stato attuale, sto eseguendo un override incondizionato ma utilizzando una variabile dinamica per abilitare il mio comportamento modificato; tuttavia, questo mi sembra troppo simile al patch delle scimmie per il mio comfort.
Per i curiosi, il (abominio ammesso) Sto mettendo a posto segue:
(in-ns 'clj-msgpack.core)
(def ^:dynamic *keywordize-strings*
"Assume that any string starting with a colon should be unpacked to a keyword"
false)
(extend-protocol Unwrapable
RawValue
(unwrap [o]
(let [v (.getString o)]
(if (and *keywordize-strings* (.startsWith v ":"))
(keyword (.substring v 1))
v))))
Forcella, aggiungere la funzionalità è necessario, e invia una richiesta di pull; ^) – noahlz
@noahz Ho inviato un ticket con il codice. Anche se a monte questa caratteristica è interessante, è una cosa molto discutibile, ma non sono sicuro che lo accetterei se fossi in loro. –
Ho fatto quel commento tounge-cheek (per i motivi che hai menzionato), ma d'altra parte ... le API dovrebbero essere "aperte per l'estensione, chiuse per la modifica". – noahlz