Re: Modular composition/plugin architecture

2009-03-05 Thread Itay Maman

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

2009-03-05 Thread Adrian Cuthbertson

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

2009-03-04 Thread Adrian Cuthbertson

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