class Stark::Struct

Public Class Methods

attr_accessor(*attrs) click to toggle source
Calls superclass method
# File lib/stark/struct.rb, line 46
def self.attr_accessor(*attrs)
  attrs.each do |a|
    n = field_number
    fields[n] = a
    self.field_number n + 1
  end
  super
end
field_number(n = nil) click to toggle source
# File lib/stark/struct.rb, line 55
def self.field_number(n = nil)
  @field_number = n if n
  @field_number ||= 1
end
fields() click to toggle source
# File lib/stark/struct.rb, line 42
def self.fields
  @fields ||= {}
end
new(fields={}) click to toggle source
# File lib/stark/struct.rb, line 3
def initialize(fields={})
  fields.each do |k,v|
    send(:"#{k}=", v) if respond_to?(:"#{k}=")
  end
end

Public Instance Methods

[](*args) click to toggle source
# File lib/stark/struct.rb, line 9
def [](*args)
  values = []
  args.each do |a|
    case a
    when Fixnum
      n = self.class.fields[a]
      values << (n ? send(n) : nil)
    when Range
      values += self[*a.to_a]
    when String, Symbol
      values << send(a)
    end
  end
  values = values.first if values.size == 1
  values
end
to_hash() click to toggle source
# File lib/stark/struct.rb, line 26
def to_hash
  {}.tap do |hash|
    self.class.fields.each do |idx,name|
      v = send name
      case v
      when Array
        hash[name] = v.map {|e| e.respond_to?(:to_hash) ? e.to_hash : e}
      when Struct
        hash[name] = v.to_hash
      else
        hash[name] = v if v
      end
    end
  end
end