Adding aspects that modify return values?

I am trying to use ‘aspectr’ to add aspects to Rails FormHelpers like
‘text_field’. I want the aspects to be able to intercept the return
value and modify it so that the original method call ‘text_field’
returns the value that I modified in the aspect.

It appears to me that aspects do not allow return values to be modified.
Too bad. This would have perfectly met the need I am after. I want to
add extra markup surrounding the ‘input’ markup in order to standardize
my views in a DRY way.

I don’t really want to fool with the original FormHelpers because I want
my add-on to be modular and separate. I considered inheriting to create
a new FormHelper, but thought better of it, since aspects seemed more

Am I wrong about aspects? Can they intercept and modify return values?
If not, what are the alternatives?

I am working on a library that will DRY up my presentation logic.
Eventually, if I can overcome these hurdles, I intend to open source the

Thanks Much!
Mario T. Lanza

On 8/20/07, Mario T. Lanza [email protected] wrote:


Thanks Much!
Mario T. Lanza

Posted via

I’m not sure about aspectr, but the convention for most AOP frameworks
that “after” advice, which runs after the method, in this case, cannot
change the value that is actually returned to the caller. Instead, you
to use “around” advice, where you explicit invoke the wrapped method (in
way that is defined by the AOP toolkit), modify the value returned, as
desired, and finally return the resulting value to the original caller.

This is how Aquarium works (sort-of…), the AOP framework for Ruby that
released earlier this week. ( In this
you could do what you want this way:

inside your FormHelpers “helper” file

around :types => /FormHelper$/, :methods => […?] do | join_point,
*args |
result = proceed # Call the “wrapped” method
result += “…”

I believe that aspectr has similar behavior.

Currently, Aquarium does allow “after” (and the more restrictive
“after_returning”) advice to modify the value returned to the caller:

after_returning :types => /FormHelper$/, :methods => […?] do |
*args |
join_point.context.returned_value = “…” +
join_point.context.returned_value + “<some-more-mark-up…”

However, this may change, so I wouldn’t count on this behavior in


I could only find :before and :after points in AspectR. I am new to
aspects, so perhaps I have overlooked how it might be done in AspectR.
Nevertheless, your Aquarius gem looks promising. I’ll give it a look.

Thank you!