Re: Modular composition/plugin architecture
Here's how plugin support is implemented in Waterfront: The last expression in each plugin is the plguin init function: a function (can be anonymous) that takes a single parameter (a map) and returns new map. The load-plugin function takes a strings (specifying the path to a .clj file), and performs load-file on each string. Then, load-plugin evals the value returned by load-file (which, in fact, is the plugin init function) passing a map as a parameter. If you're loading several plugins the result returned from the init function will be used as the new map passed to the next plugin. Anyway, enough talking, let's go coding: ; say myutil/ut1.clj contains (ns 'myutil.ut1) (defn foo [] :foo-ut1) ; init function of ut1 (fn [m] (assoc m :foo foo)) ; and myutil/ut2.clj contains (ns 'myutil.ut2) (defn foo [] :foo-ut2) ; init function of ut2 (fn [m] (assoc m :foo foo)) (defn load-plugin [path] ((load-file path) {}) ) ;mylib/lib1.clj (defn libfoo [] (((load-plugin (if some-condition myutil/ut1.clj myutil/ ut2.clj)) :foo)) ) That's it. In Waterfront this design is integrated with the context pattern which I described here a few days ago. Hope that helps. -- Itay Maman http://javadots.blogspot.com On Mar 5, 6:48 am, Adrian Cuthbertson adrian.cuthbert...@gmail.com wrote: Hi, How would one create a plugin modular composition using clojure functions/modules only (i.e without resorting to java interface/ plugin class implementations)? For example; ; say myutil/ut1.clj contains (ns 'myutil.ut1) (defn foo [] :foo-ut1) ; and myutil/ut2.clj contains (ns 'myutil.ut2) (defn foo [] :foo-ut2) ;and mylib/lib1.clj contains (defn libfoo [] (foo)) Then from my app, I'd like to tell mylib.lib1 which ut to use when it loads, before calling libfoo. Is this possible, or is there some other clojure way of doing this? Thanks, Adrian. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~--~~~~--~~--~--~---
Re: Modular composition/plugin architecture
Thanks Itay, that's exactly what I need. On Thu, Mar 5, 2009 at 1:15 PM, Itay Maman itay.ma...@gmail.com wrote: Here's how plugin support is implemented in Waterfront: The last expression in each plugin is the plguin init function: a function (can be anonymous) that takes a single parameter (a map) and returns new map. The load-plugin function takes a strings (specifying the path to a .clj file), and performs load-file on each string. Then, load-plugin evals the value returned by load-file (which, in fact, is the plugin init function) passing a map as a parameter. If you're loading several plugins the result returned from the init function will be used as the new map passed to the next plugin. Anyway, enough talking, let's go coding: ; say myutil/ut1.clj contains (ns 'myutil.ut1) (defn foo [] :foo-ut1) ; init function of ut1 (fn [m] (assoc m :foo foo)) ; and myutil/ut2.clj contains (ns 'myutil.ut2) (defn foo [] :foo-ut2) ; init function of ut2 (fn [m] (assoc m :foo foo)) (defn load-plugin [path] ((load-file path) {}) ) ;mylib/lib1.clj (defn libfoo [] (((load-plugin (if some-condition myutil/ut1.clj myutil/ ut2.clj)) :foo)) ) That's it. In Waterfront this design is integrated with the context pattern which I described here a few days ago. Hope that helps. -- Itay Maman http://javadots.blogspot.com On Mar 5, 6:48 am, Adrian Cuthbertson adrian.cuthbert...@gmail.com wrote: Hi, How would one create a plugin modular composition using clojure functions/modules only (i.e without resorting to java interface/ plugin class implementations)? For example; ; say myutil/ut1.clj contains (ns 'myutil.ut1) (defn foo [] :foo-ut1) ; and myutil/ut2.clj contains (ns 'myutil.ut2) (defn foo [] :foo-ut2) ;and mylib/lib1.clj contains (defn libfoo [] (foo)) Then from my app, I'd like to tell mylib.lib1 which ut to use when it loads, before calling libfoo. Is this possible, or is there some other clojure way of doing this? Thanks, Adrian. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~--~~~~--~~--~--~---
Modular composition/plugin architecture
Hi, How would one create a plugin modular composition using clojure functions/modules only (i.e without resorting to java interface/ plugin class implementations)? For example; ; say myutil/ut1.clj contains (ns 'myutil.ut1) (defn foo [] :foo-ut1) ; and myutil/ut2.clj contains (ns 'myutil.ut2) (defn foo [] :foo-ut2) ;and mylib/lib1.clj contains (defn libfoo [] (foo)) Then from my app, I'd like to tell mylib.lib1 which ut to use when it loads, before calling libfoo. Is this possible, or is there some other clojure way of doing this? Thanks, Adrian. --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~--~~~~--~~--~--~---