Rubyで UNIVERSAL::require 風に new するやつ

module ClassFactory
  def get( str, force = false )
    begin
      mod = str.to_s.split( /::|\./ )
      if mod.length == 1
        return Module.const_get( mod.shift )
      else
        @target = Module.const_get( mod.shift )
        while mod.length != 0
          @target = @target.const_get( mod.shift )
        end
        return @target
      end
    rescue StandardError
      if force
        return @target
      else
        raise NameError, "Can\'t get class: #{str}"
      end
    end
  end

  def create( name, *args )
    return self::get( name ).new( *args )
  end
  module_function :get, :create

  module Module
    def new( *args )
      ClassFactory::create( self.to_s, *args )
    end

    def to_klass
      ClassFactory::get( self.to_s )
    end
  end
end

class String
  include ClassFactory::Module
end

class Symbol
  include ClassFactory::Module
end

p "Object".new
=> #<Object:0xb7fb9074>

eval つかってない!!(笑

こんな感じでいいのかなぁ。