I'm trying to use the ruby-serialport library
(http://rubyforge.org/projects/ruby-serialport/) under Ruby 1.8.2 on Windows
XP, and I ran into some odd behaviour.  Perhaps someone here can explain
what's going on.

First, here's a much-elided excerpt from serialport.c:

....
void Init_serialport() {
  ...
  cSerialPort = rb_define_class("SerialPort", rb_cIO);
  rb_define_singleton_method(cSerialPort, "create", sp_create, 1);
  ...
  rb_eval_string(
    "class SerialPort\n"

      "private_class_method(:create)\n"
       ...
    "end\n"
  );
}

When serialport.so is 'require'd normally, the following error is reported:

"(eval):1: (eval):1:in `private_class_method': undefined method `create' for
class `Class' (NameError)
        from (eval):1
        from
c:/lang/ruby/ruby1.8.2/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:
in `require'
        from -e:1"

As you can see from the error, the 'require' that is being called is really
rubygems' 'custom_require', which is aliased to 'require' by rubygems.
Rubygems is being loaded automatically due to it's default inclusion in
RUBYOPT.

When I bypass the rubygems 'require' however, either by passing -rserialport
on the command line or by calling 'require__ "serialport"', the library
loads successfully.

I've looked at the require_custom code, and it's pretty straightforward.
Why is that eval failing under custom_require, but succeeding under Ruby's
vanilla 'require'?

Any help would be appreciated,

Avdi Grimm