JRuby doesn't support annotations because Ruby doesn't support
annotations. So what! We can extend Ruby to add something like annotations:
class JPABean
def self.inherited(clazz)
@@annotations = {}
end
def self.anno(annotation)
@@last_annotation = annotation
end
def self.method_added(sym)
@@annotations[sym] = @@last_annotation
end
def self.get_annotation(sym)
return @@annotations[sym]
end
end
Given this, we can do things like the following:
class MyBean < JPABean
anno :sql => "SELECT * FROM stuff WHERE name = 'foo'"
def foo; end
anno :field => :hello_id
attr :hello
anno :field => :bar_in_table
attr_accessor :bar
end
And here's some output from the resulting class:
p MyBean.get_annotation(:foo)
p MyBean.get_annotation(:hello)
p MyBean.get_annotation(:bar=)
=>
{:sql=>"SELECT * FROM stuff WHERE name = 'foo'"}
{:field=>:hello_id}
{:field=>:bar_in_table}
So as you can see we really do have all the necessary requirements to
annotate classes. Now what if we just had MyBean be a java.lang.Object
extension and stuffed the annotations into the resulting generated
class? Bingo, we've got annotation support in JRuby on Java classes too.
This should enable things like Hibernate, JPA, and JUnit 4 to work
with JRuby's Ruby-based classes. Or at least, I believe it to be
possible. It just requires a little work on the Java integration stuff
to add annotation information to the resulting classes.
The seed is planted. Help it germinate!
- Charlie
---------------------------------------------------------------------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email