Comments (5)
I'm not sure what you mean by "decorate" in this case, but if you want to replace ::sms-sender
with ::logged-sms-sender
, then all you need to do is:
(derive ::logged-sms-sender ::sms-sender)
Then ensure that ::logged-sms-sender
is the only key that derives from ::sms-sender
in your map.
from integrant.
"decorate" means to use decorator pattern.
I have defined sms-sender
and logger
components.
And I want to create a new logged-sms-sender
.
May be like this:
;; I guess this isn't work with integrant
(defmethod ig/init-key ::logged-sms-sender [_ {:keys [logger sms-sender]}]
(fn [msg]
(logger msg)
(sms-sender msg)))
Or I can use ugly get-method
:
(derive ::logged-sms-sender ::sms-sender)
(defmethod ig/init-key ::logged-sms-sender [_ {:keys [logger], :as params}]
(fn [msg]
(let [sms-sender ((get-method ig/init-key ::sms-sender) params)]
(logger msg)
(sms-sender msg))))
from integrant.
You don't need to use get-method
. You can just write:
(defmethod ig/init-key ::logged-sms-sender [_ {:keys [logger] :as opts}]
(let [sms-sender (ig/init-key ::sms-sender opts)]
(fn [msg]
(logger msg)
(sms-sender msg))))
If you want a generic logging "decorator" then you could write something like:
(defmethod ig/init-key ::logged [_ {:keys [logger fn]}]
(fn [& args]
(logger args)
(apply fn args)))
And then in your configuration you could write:
{::logger {}
::sms-sender {}
[::logged ::logged-sms-sender] {:logger #ig/ref ::logger, :fn #ig/ref ::sms-sender}}
from integrant.
I liked the first example. Thanks for idea.
But I don't understand second example.
{::logger {}
::sms-sender {}
::component-1 {:sms-sender #ig/ref ::sms-sender}
[::logged ::logged-sms-sender] {:logger #ig/ref ::logger, :fn #ig/ref ::sms-sender}}
::component-1
must get [::logged ::logged-sms-sender]
as dependency.
from integrant.
You'd need to rename the keys in my last example; either by changing the references or renaming ::sms-sender
key.
from integrant.
Related Issues (20)
- Uninitialized/literal configs HOT 1
- Tests don't run with 1.11 due to clojure.test/run-test already being defined HOT 1
- Feature proposal: expand-key HOT 2
- Any way to add constant key in `edn`? HOT 2
- ClojureScript support for `read-string` HOT 4
- Initialisation Order HOT 5
- Deprecate :include-refsets? in favor of :include-reflikes? HOT 16
- Decouple top-level keys from configuration type definitions HOT 9
- [Feature] Ability to provide custom hierarchy to `init` method HOT 6
- Would you consider an integrant2 to support extensible build steps? HOT 10
- Why does resume halt unspecified system keys? HOT 4
- Support usage in Babashka environments HOT 20
- #{:idea} Pass the spec validations step on all defined states before calling init-key. HOT 1
- is it possible to access a component after it's init-key, but before it gets passed to the next key that depends on it? HOT 2
- Enter Integrant Video
- Add support for custom assertf definitions HOT 2
- Question: Extract "validation keys" logic from core/build implementation HOT 4
- Feature request: pre-init hook
- No method in multimethod 'init-key' for dispatch value HOT 2
- #ig/ref should allow for deep references HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from integrant.