module Packable

Requires that an including class can be instantiated entirely by keyword args that map these symbols to values

Constants

PACKED_CLASS_KEY

Public Class Methods

included(base) click to toggle source
# File lib/musicality/packable.rb, line 6
def self.included(base)
  base.extend(ClassMethods)
  base.class_variable_set(:@@special_packing, {})
  base.class_variable_set(:@@special_unpacking, {})
end
pack_val(val) click to toggle source
# File lib/musicality/packable.rb, line 132
def pack_val val
  if val.is_a?(Packable)
    val.pack
  elsif val.is_a? Array
    val.map {|v| pack_val v}
  elsif val.is_a? Hash
    Hash[ val.map {|k,v| [ Packable.pack_val(k), Packable.pack_val(v) ]} ]
  else
    val
  end
end
recover_class(klass_str) click to toggle source
# File lib/musicality/packable.rb, line 110
def recover_class klass_str
  Kernel.const_get(klass_str)
end
unpack_val(val) click to toggle source
# File lib/musicality/packable.rb, line 117
def unpack_val val
  if val.is_a? Array
    val.map {|v| Packable.unpack_val v}
  elsif val.is_a? Hash
    if val.packed_class?
      val.unpack
    else
      Hash[ val.map {|k,v| [ Packable.unpack_val(k), Packable.unpack_val(v) ]} ]
    end
  else
    val
  end
end

Public Instance Methods

class_str() click to toggle source
# File lib/musicality/packable.rb, line 92
def class_str
  self.class.to_s
end
init_params() click to toggle source
# File lib/musicality/packable.rb, line 88
def init_params
  self.class.init_params
end
pack() click to toggle source
# File lib/musicality/packable.rb, line 96
def pack
  packing = { PACKED_CLASS_KEY => class_str }
  init_params.keys.each do |name|
    val = self.send(name)
    val2 = if self.class.packs_specially?(name)
      self.class.pack_specially(name,val)
    else
      Packable.pack_val(val)
    end
    packing[name] = val2
  end
  packing
end

Private Instance Methods

pack_val(val) click to toggle source
# File lib/musicality/packable.rb, line 132
def pack_val val
  if val.is_a?(Packable)
    val.pack
  elsif val.is_a? Array
    val.map {|v| pack_val v}
  elsif val.is_a? Hash
    Hash[ val.map {|k,v| [ Packable.pack_val(k), Packable.pack_val(v) ]} ]
  else
    val
  end
end
recover_class(klass_str) click to toggle source
# File lib/musicality/packable.rb, line 110
def recover_class klass_str
  Kernel.const_get(klass_str)
end
unpack_val(val) click to toggle source
# File lib/musicality/packable.rb, line 117
def unpack_val val
  if val.is_a? Array
    val.map {|v| Packable.unpack_val v}
  elsif val.is_a? Hash
    if val.packed_class?
      val.unpack
    else
      Hash[ val.map {|k,v| [ Packable.unpack_val(k), Packable.unpack_val(v) ]} ]
    end
  else
    val
  end
end