Sha256: 60c1ca5ebc180ff2546678857ed80ee05675913b190b4dbe1dc445f67ef66c58

Contents?: true

Size: 1.12 KB

Versions: 14

Compression:

Stored size: 1.12 KB

Contents

# -*- encoding : utf-8 -*-
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

14 entries across 14 versions & 1 rubygems

Version Path
map-6.4.2 lib/map/struct.rb
map-6.4.1 lib/map/struct.rb
map-6.4.0 lib/map/struct.rb
map-6.3.0 lib/map/struct.rb
map-6.2.0 lib/map/struct.rb
map-6.1.0 lib/map/struct.rb
map-6.0.1 lib/map/struct.rb
map-6.0.0 lib/map/struct.rb
map-5.8.0 lib/map/struct.rb
map-5.6.1 lib/map/struct.rb
map-5.5.0 lib/map/struct.rb
map-5.4.0 lib/map/struct.rb
map-5.3.0 lib/map/struct.rb
map-5.2.0 lib/map/struct.rb