CoralMUD-0.15/
CoralMUD-0.15/core/
CoralMUD-0.15/data/
CoralMUD-0.15/data/areas/
CoralMUD-0.15/data/help/
CoralMUD-0.15/data/players/
CoralMUD-0.15/lib/automap/
CoralMUD-0.15/lib/items/
class Object
  def metaclass
    class << self; self; end
  end
end

class IDN
  include Singleton
  def self.newid
    if !@idnum
      File.open('data/idnum.txt', 'r') do |fin|  
        @idnum = YAML::load(fin)
      end  
    end
    @idnum += 1
    File.open('data/idnum.txt', 'w' ) do |out|
      YAML::dump @idnum, out
    end
    @idnum
  end
end

# used to build facades of another class.   Particularly useful for saving memory on instances of template objects...like items or mobiles.
class Class
  def attr_facade (*attributes)
    attributes.each do |att|
      # for each var
      define_method("#{att}=") do |val|
        return if !val
        self.metaclass.send(:define_method, "#{att}") do 
          instance_variable_get("@#{att}")
        end
        instance_variable_set("@#{att}",val)
      end
    end
  end
end

class Facade
  def initialize thing, assign_id=true
    @id = IDN.newid if assign_id
    @hides = thing # thing hides behind facade
  end

  def id
    @id
  end

  def method_missing name, *args
    @hides.send(name, *args)
  end

  def to_s
    "#{@hides}"
  end

  def is_a? type
    return @hides.is_a? type
  end

  def ===(other)
    return @hides.is_a? other
  end

end

class ATest
  attr_accessor :name
  def initialize
    @name = "test"
  end
end

class TestFacade < Facade
  attr_facade :name
  def initialize hides, flag
    super hides, flag
  end
end

test = ATest.new
facade = TestFacade.new(test, false)

def puts_test test, facade
  puts "test.name:   " + test.name
  puts "facade.name: " + facade.name
end

puts_test(test, facade)
facade.name = facade.name + "ownted"
puts_test(test, facade)
facade2 = TestFacade.new(test,false)
puts_test(test, facade2)