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

Reply via email to