views:

11

answers:

1

Hi,

I would like to create a macro that takes a string as a parameter and evaluates that to an object. Something like:

#macro( valueTest $objRef)
  #define( $obj )#evaluate("$${objRef}")#end
  $obj.foo ## This would have to be translated to $obj.getFoo()
#end

Unfortunately the $obj variable does not point to object reference that could be used to call methods. $obj is a String and $obj.foo does not try to execute getFoo.

Somewhy I have a feeling that this is the nature of evaluate and it is not possible to do what I want to.

the reason why I want to do smth like this is because we have quite few macros that take both command bind path and command itself as a parameter and I am hoping the latter could be derived from first.

A: 
Unfortunately, Velocity does not have a mechanism to define functions which return object references.  Macros are really intended to be a shortcut to display text.

In cases like this, the way to proceed is generally to create a "tool" in Java and put an instance in the context. A tool is just an ordinary class with a method that returns what you are looking for

e.g.

create an object with an "eval" method, then put it in the context as "referenceEvaluator".

#set($obj = $referenceEvaluator.eval($objRef))

You might find that your code is clearer if you avoid the double evaluation and just insert an object into the context named $obj that does what you want. (better performance, too).

Will Glass