From: Jim Menard <jimm / eris.io.com>
Subject: [ruby-talk:9199] Class from name of class
Date: Fri, 12 Jan 2001 23:10:02 +0900

> I have a class name in a string, and I want to create an instance of that
> class. Can I do so without using eval? I'm looking for something like
> Java's "Class.forName(className)" or Smalltalk's "Smalltalk classNamed:
> className".
> 
> I am trying to build a Web page that can list objects of multiple classes.
> One CGI parameter is the class name. This code violates mod_ruby security
> policy:
> 
>     className = cgi['class_name'][0]
>     var = eval "#{className}.instance()" # it's a singleton, thus instance()
>     require className

If you already know what class you may instantiate, you can use
Hash of Classes indexed by their names.

  ClassTable = {'Foo' => Foo, 'Bar' => Bar}

  className = cgi['class_name'][0]
  ClassTable[className].instance()

Well, it is not as powerful as "Class.forName(className)" thing (I do
not know Java), but it give you fine grained control over what can be
done by users (probably good thing for a CGI script).

ClassTable can be constructed from some kind of config file or
automatically generate by some reflection feature.  Following example
assume all classes used this way are subclass of Base.

  class Base
    def Base.inherited(sub)
      ClassTable[sub.name] = sub
    end
  end

  class Foo < Base
    ...
  end


Kenichi Komiya.