Sha256: 2d3093e917f1bc2455476beab4fb9191217c524eacafa058cd46fb1f99aae6c7

Contents?: true

Size: 967 Bytes

Versions: 1

Compression:

Stored size: 967 Bytes

Contents

require "key_struct/version"

module KeyStruct

  def self.reader(*keys)
    define_key_struct(:attr_reader, keys)
  end

  def self.accessor(*keys)
    define_key_struct(:attr_accessor, keys)
  end

  instance_eval do
    alias :[] :accessor
  end

  private

  def self.define_key_struct(access, keys) 
    Class.new.class_eval do
      keyvalues = Hash[*keys.map{|key| (Hash === key) ? key.to_a : [key, nil]}.flatten(2)]
      keys = keyvalues.keys
      send access, *keys
      define_method(:initialize) do |args={}|
        args = keyvalues.merge(args)
        keys.each do |key|
          instance_variable_set("@#{key}".to_sym, args.delete(key))
        end
        raise ArgumentError, "Invalid argument(s): #{args.keys.map(&:inspect).join(' ')}; KeyStruct accepts #{keys.map(&:inspect).join(' ')}" if args.any?
      end
      define_method(:==) do |other|
        keys.all?{|key| self.send(key) == other.send(key)}
      end
      self
    end
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
key_struct-0.1.2 lib/key_struct.rb