On 16.08.2016 10:45, Gerrit Telkamp wrote:
I'm using groovy.util.DelegatingScript to realize a simple DSL. It works
quite well and the implementation was straight forward.
Now I would like to extend my DSL by more words. Usually, this would be
done by implementing each word as method in the delegate class.
Instead I would like to split the code into several delegate classes.
Having a look into the source, it seems to me that it would be easy to
iterate a list of delegate classes and branching into a the first method
that has been found first.
What do the groovy developers say about this? Have I missed something,
or is this something that is alrady planned? A future idea would be to
re-use the DSL classes in an application-specific combination for other
projects.

actually the class you delegate to can do this logic. Like:

class MyDelegate {
  def listOfDelegates = []

  def invokeMethod(String name, Object args) {
    listOfDelegates.each {
      try {
        return it."$name"(*args)
      } catch (MissingMethodException mme) {
        // swallow the exception here?
      }
    }
    throw new MissingMethodException(..)
  }
}

and then
new DelegatingScript(delegate: new MyDelegate(list:[delegate1, delegate2,...]))

You could also realize a chain of delegates:

class EndPoint {}
class BasicDSL extends DelegatingScript {...}
class ExtendedDSL extends DelegatingScript {...}

new DelegatingScript(delegate:new ExtendedDSL(delegate: new BasicDSL(delegate:new EndPoint())))

or combine the approaches... or even:

class MyDelegate extends DelegatingScript{
  MyDelegate(listOfDelegates = []) {
delegate = listOfDelegates.inject(new EndPoint()) { prev, it -> it.newInstance(delegate: prev) }
  }
}
new DelegatingScript(delegate:new MyDelegate(BasicDSL, ExtendedDSL))

bye Jochen


Reply via email to