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 -~----------~----~----~----~------~----~------~--~---