# -*- ruby -*-

if( (h = Hash.new{|h,k|h[k]=k}) && !h[true] )
  class Hash
    alias __aref []
    alias __initialize initialize
    alias __default= default=
    alias __default default

    def initialize(*args, &block)
      __initialize(*args)
      @default_proc = block
    end

    def [](key)
      if( !key?(key) && @default_proc )
	@default_proc.call(self,key)
      end
      __aref(key)
    end

    def default_proc
      @default_proc
    end

    def default(k = nil)
      if( k && @default_proc )
	@default_proc.call(self, k)
      else
	__default
      end
    end

    def default=(val)
      __default=(val)
      @default_proc = nil
      val
    end
  end
end
