Sha256: 88a400f43c38ca22e914a2bec3addb5eabede238c5cfcfc2a74616bf3b478d0b

Contents?: true

Size: 1.09 KB

Versions: 7

Compression:

Stored size: 1.09 KB

Contents

class Map
  class Struct
    instance_methods.each { |m| undef_method m unless m =~ /^__|object_id/ }

    attr :map

    def initialize(map)
      @map = map
    end

    def method_missing(method, *args, &block)
      method = method.to_s
      case method
        when /=$/
          key = method.chomp('=')
          value = args.shift
          @map[key] = value
        when /\?$/
          key = method.chomp('?')
          value = @map.has?( key )
        else
          key = method
          raise(IndexError, key) unless @map.has_key?(key)
          value = @map[key]
      end
      value.is_a?(Map) ? value.struct : value
    end

    Keys = lambda{|*keys| keys.flatten!; keys.compact!; keys.map!{|key| key.to_s}} unless defined?(Keys)

    delegates = %w(
      inspect
    )

    delegates.each do |delegate|
      module_eval <<-__, __FILE__, __LINE__
        def #{ delegate }(*args, &block)
          @map.#{ delegate }(*args, &block)
        end
      __
    end
  end

  def struct
    @struct ||= Struct.new(map=self)
  end

  def Map.struct(*args, &block)
    new(*args, &block).struct
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
map-5.1.0 lib/map/struct.rb
map-4.7.1 lib/map/struct.rb
map-4.7.0 lib/map/struct.rb
map-4.6.1 lib/map/struct.rb
map-4.6.0 lib/map/struct.rb
map-4.5.1 lib/map/struct.rb
map-4.5.0 lib/map/struct.rb