class Embulk::JavaPlugin

def self.ruby_adapter_class(java_class, ruby_base_class, ruby_module)

def self.ruby_adapter_class(java_class, ruby_base_class, ruby_module)
  Class.new(ruby_base_class) do
    const_set(:PLUGIN_JAVA_CLASS, java_class)
    include ruby_module
    extend ruby_module::ClassMethods
    unless method_defined?(:plugin_java_object)
      def plugin_java_object
        @plugin_java_object ||= self.class.new_java
      end
    end
    unless (class<<self;self;end).method_defined?(:plugin_java_class)
      def self.plugin_java_class
        self::PLUGIN_JAVA_CLASS
      end
    end
    # TODO ruby_base_class already implements new_java. So
    #      this line returns always true:
    #unless (class<<self;self;end).method_defined?(:new_java)
    #      but this line could return false unexpectedly if
    #      ruby_module::ClassMethods includes other modules.
    unless ruby_module::ClassMethods.method_defined?(:new_java)
      def self.new_java
        Java::org.embulk.plugin.PluginManager.newPluginInstance(plugin_java_class, Embulk::Java::EmbulkSystemProperties)
      end
    end
  end
end