class StaticStruct::Structure

Attributes

static_methods[R]

Public Class Methods

new(hash) click to toggle source
# File lib/static_struct/structure.rb, line 7
def initialize(hash)
  @static_methods = SortedSet.new
  define_structure(hash)
end

Public Instance Methods

==(other) click to toggle source
# File lib/static_struct/structure.rb, line 24
def ==(other)
  current_state == other.current_state
end
each() { |m, public_send(m)| ... } click to toggle source
# File lib/static_struct/structure.rb, line 28
def each
  static_methods.each do |m|
    yield m, public_send(m)
  end
end
inspect() click to toggle source
# File lib/static_struct/structure.rb, line 20
def inspect
  to_s
end
to_s() click to toggle source
# File lib/static_struct/structure.rb, line 12
def to_s
  joined_line = [self.class, current_state].map(&:to_s).select do |str|
    str.size > 0
  end.join(' ')

  "#<#{joined_line}>"
end

Protected Instance Methods

current_state() click to toggle source
# File lib/static_struct/structure.rb, line 36
def current_state
  static_methods.map do |method|
    "#{method}=#{public_send(method)}"
  end.join(' ')
end

Private Instance Methods

define_structure(hash) click to toggle source
# File lib/static_struct/structure.rb, line 44
def define_structure(hash)
  Hash(hash).each do |key, val|
    safe_define_method(key, val)
  end
end
safe_define_method(method, return_value) click to toggle source
# File lib/static_struct/structure.rb, line 50
def safe_define_method(method, return_value)
  if respond_to?(method)
    fail MethodAlreadyDefinedError, "`#{method}' is already defined for #{self}"
  end

  static_methods.add(method.to_s)
  case
  when return_value.is_a?(Array)
    define_singleton_method(method) do
      return_value.map do |array_value|
        if array_value.respond_to?(:to_hash)
          Structure.new(array_value)
        else
          array_value
        end
      end
    end
  when return_value.is_a?(Hash)
    define_singleton_method(method) { Structure.new(return_value) }
  when return_value.respond_to?(:to_hash)
    define_singleton_method(method) { Structure.new(Hash(return_value)) }
  else
    define_singleton_method(method) { return_value }
  end
end