Hi all,
I am writing a DSL for a Java object model using Jruby (and having a
good time doing it!), and I’m making heavy use of the “Eval’d block”
pattern. My problem is setters within those blocks. Here’s some
simplified code:
Java bean:
public class TestBean {
private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
JRuby:
class TestBean
def self.generate (&block)
bean = TestBean.new
bean.instance_eval &block
bean
end
end
direct_bean = TestBean.new
direct_bean.name = “bar”
puts direct_bean.name
bean = TestBean.generate do
set_name “foo”
end
puts bean.name
bean2 = TestBean.generate do
name = “baz”
end
puts bean2.name
Expected output:
bar
foo
baz
Actual output:
bar
foo
nil
I can see if i use “puts methods” within the last block that name= is
defined for TestBean within the block but it does not do what I expect
it to (call setName()). What gives? Is this the expected behavior, and
in that case why? The behavior is the same if I extend the TestBean
class instead of reopening it. Sorry for the clunky code, I’m still
working on my Ruby-fu…
Thanks,
/Mns
since I ran into the same issue during the weekend
name = “baz”
just set a local variable’name’ which is never used again. you need to
call the setter (if it exists) by
self.name = “baz”
regards, Kristian
2011/3/9 Måns af Klercker [email protected]:
private String _name_;
bean
puts bean.name
working on my Ruby-fu…
–
Kristian Meier + Sanuka Meier
Vadakkethu House,
Edayanmula West PO - 689532,
Pathanamthitta District, Kerala, INDIA
tel: +91 468 2319577
protect your privacy while searching the net: www.ixquick.com
_=_
q(-_-)p
'_) (_`
/__/ \
_(<_ / )_
(__\_\_|_/__)
Thank you Kristian for your quick answer! So if I understand you
correctly:
When called in the scope within bean.instance_eval, creating the local
variable ‘name’ has higher precedence than calling the ‘self.name=’
method? That makes ok sense I guess. It 's a little unfortunate for my
DSL, since it (sort-of) adds noise. I have used ‘set_name “baz”’
sucessfully, which is similar.
The idea of my project is of course to be able to construct a DSL for
creating Java bean objects which is clear and low on noise. ‘name =
“baz”’ seemed nice and clear Anyone have any suggestions on how to
avoid calling set_XXX or self.XXX directly in these blocks that does
not add much boilerplate code to the DSL definition code? Might there
be Ruby mind-tricks to acheive it?
cheers,
/Mns
Pretty neat, but I have, say 20 classes, some of them with more than
50 bean properties. That’s a lot of extra code I’m wondering if
there’s some dynamic way of doing this and still keep decent
performance – somtimes there are more than 1M objects in these
graphs.
cheers,
/Mns
2011/3/9 kristian [email protected]:
Your performance question aside…
You could write something which uses introspection to ask for all bean
properties and then write some code to generate a method like Kristian
described and then call that code on each property. Magic generation!
pure pseudo babble
bean.properties.each do |prop|
generate_getter_setter_for(prop)
end
Make your own java_import wrapper method and you can essentially make
this close to zero written lines (well a modest amount for the meta
programming code).
There are other considerations in this scheme like name collisions,
but it may be helpful in keeping your DSL code DRY.
-Tom
2011/3/9 Mns af Klercker [email protected]:
what I do is to define
and reduces the “noise”
sucessfully, which is similar.
public class TestBean {
bean.instance_eval &block
end
baz
class instead of reopening it. Sorry for the clunky code, I’m still
tel: +91 468 2319577
http://xircles.codehaus.org/manage_email
Pathanamthitta District, Kerala, INDIA
(__|_/)
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email
–
blog: http://blog.enebo.com twitter: tom_enebo
mail: [email protected]
what I do is to define
def name(val =nil)
@name = val if val
@name
end
which allows me to use
name “baz”
and reduces the “noise”
regards, Kristian
2011/3/9 Måns af Klercker [email protected]:
“baz”’ seemed nice and clear Anyone have any suggestions on how to
name = “baz”
I am writing a DSL for a Java object model using Jruby (and having a
}
name = “baz”
foo
/Måns
_=_
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email
–
Kristian Meier + Sanuka Meier
Vadakkethu House,
Edayanmula West PO - 689532,
Pathanamthitta District, Kerala, INDIA
tel: +91 468 2319577
protect your privacy while searching the net: www.ixquick.com
_=_
q(-_-)p
'_) (_`
/__/ \
_(<_ / )_
(__\_\_|_/__)
Thanks a lot Kristian, I couldn’t ask for more!
cheers,
/Mns
2011/3/9 kristian [email protected]: