Johann Hibschman <johann / physics.berkeley.edu> writes:

> Now I want to call a magic procedure, like
> 
> double_it(Test, "foo", "foo2")
> 
> which would have the effect of doing
> 
> class Test
>   def foo2
>     foo
>     foo
>   end
> end
> 
> I can do
> 
> Test.class_eval {
>   def foo2
>     foo
>     foo
>   end
> }
> 
> to add methods, but I don't know how to write the method at run-time.

You just did :)

  def double_it(klass, single, double)
    klass.class_eval %{
      def #{double}(*args)
        #{single}(*args)
        #{single}(*args)
      end
    }
  end

  class Dave
    def hello(name)
      puts "Hello, #{name}"
    end
  end

  double_it(Dave, :hello, :moreHello)

  d = Dave.new
  d.moreHello("Johann")

However, you could also have fun by making it a method of class Class:

  class Class
    def double(single, double)
      class_eval %{
        def #{double}(*args)
          #{single}(*args)
          #{single}(*args)
        end
      }
    end
  end


  class Dave
    def hello(name)
      puts "Hello, #{name}"
    end

    double :hello, :moreHello
  end

  Dave.new.moreHello("Fred")



Regards


Dave