Ezra Zygmuntowicz wrote:
> On Oct 20, 2007, at 10:28 PM, Ben Tilly wrote:
> 
>> Like initialize.  Or create objects of that type.
>> I would make sure that Prototype's new method would create a new class
>> Thanks,
>> Ben
>> -- 
>> Posted via http://www.ruby-forum.com/.
>>
> 
> http://codeforpeople.com/lib/ruby/prototype/prototype-2.0.0/README

If I'd seen that before I implemented mine, I would have just shown 
that.  However I already have another one.  I did borrow some ideas from 
that one.  Here goes:

  class PrototypeClass
    attr_reader :prototype

    def initialize (*prototype)
      @prototype = prototype[0]
    end

    def new (*definitions)
      new_class = Class.new(self.class)
      for definition in definitions
        new_class.module_eval definition
      end
      return new_class.new(self)
    end

    def def (definition)
      self.class.module_eval "def #{definition} end"
    end

    def include (mod)
      self.class.module_eval "include #{mod}"
    end
  end

  Prototype = PrototypeClass.new(nil)

And here is a sample of usage:

  @foo = Prototype.new %q{
    attr_accessor :name
  }
  @bar = @foo.new
  @baz = @bar.new

  @foo.name = "foo"
  @bar.name = "bar"
  @baz.name = "baz"

  def test_greet
    try_greet = lambda {|obj|
      if obj.respond_to? :greet
        obj.greet(obj.name)
      else
        puts obj.name
        puts "Object #{obj.name} (#{obj.id}) cannot greet"
      end
    }
    try_greet[@foo]
    try_greet[@bar]
    try_greet[@baz]
  end

  test_greet()

  @bar.def %q{ greet (name)
    puts "Greeting from #{name} (id #{self.id})"
  }

  puts "Defined bar.greet"

  test_greet()

  module Mod
    def greet (name)
      puts "Hello from #{name} (#{self.id})"
    end
  end

  @foo.include(Mod)
  puts "Included module"

  test_greet()

Cheers,
Ben
-- 
Posted via http://www.ruby-forum.com/.