Sha256: 615ff4443cc2f55336d3e95a545984899d4636931c8a8ce0693d359374a45fb7

Contents?: true

Size: 1.08 KB

Versions: 1

Compression:

Stored size: 1.08 KB

Contents

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

  def attributes
    self.class.attribute_names.reduce({}) { |ret, name|
      ret.update(name => self.send(name))
    }
  end

  def ==(other)
    attributes == other.attributes
  end

  def inspect
    "#<#{self.class} #{
      attributes
        .map { |key, val| "#{key}=#{val.inspect}" }
        .join(', ')
    }>"
  end

  alias_method :to_h, :attributes
  alias_method :eql?, :==
  alias_method :to_s, :inspect

  module ClassMethods
    attr_reader :attribute_names

    def to_struct
      return Struct.const_get(name, false) if Struct.const_defined?(name, false)

      Struct.new(name, *attribute_names) do
        def initialize(data = {})
          data.each { |key, val| self.send("#{key}=", val) }
        end
      end
    end

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

    def attribute(name, &blk)
      define_method(name, &blk)
      @attribute_names << name
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
structure-0.27.3 structure.rb