Sha256: c6a31ea5118e4502a73cd568a113285f588ad97b254e302878faff20e57fb562

Contents?: true

Size: 886 Bytes

Versions: 1

Compression:

Stored size: 886 Bytes

Contents

module Structure
  def self.included(base)
    base.extend(ClassMethods)
    base.instance_variable_set(:@value_names, [])
  end

  def values
    vals = {}
    self.class.value_names.each { |name| vals[name] = self.send(name) }

    vals
  end

  def to_h
    Hash[values.dup.map { |k, v| [k, v.respond_to?(:to_h) ? v.to_h : v] } ]
  end

  def ==(other)
    values == other.values
  end
  alias :eql? :==

  def inspect
    str = "#<#{self.class}"

    first = true
    values.each do |k, v|
      str << ',' unless first
      first = false
      str << " #{k}=#{v.inspect}"
    end

    str << '>'
  end
  alias :to_s :inspect

  module ClassMethods
    attr :value_names

    def inherited(subclass)
      subclass.instance_variable_set(:@value_names, value_names.dup)
    end

    def value(name, &blk)
      define_method(name, &blk)
      @value_names << name
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
structure-0.26.0 lib/structure.rb