module Packable::ClassMethods

Public Instance Methods

init_params() click to toggle source
# File lib/musicality/packable.rb, line 58
def init_params
  params = instance_method(:initialize).parameters
  Hash[ params.map {|pair| pair.reverse } ]
end
pack_specially(sym, val) click to toggle source
# File lib/musicality/packable.rb, line 79
def pack_specially sym, val
  class_variable_get(:@@special_packing)[sym].call(val)
end
packs_specially?(sym) click to toggle source
# File lib/musicality/packable.rb, line 71
def packs_specially? sym
  class_variable_get(:@@special_packing).has_key?(sym)
end
special_packing(sym, &block) click to toggle source
# File lib/musicality/packable.rb, line 63
def special_packing sym, &block
  class_variable_get(:@@special_packing)[sym] = block
end
special_unpacking(sym, &block) click to toggle source
# File lib/musicality/packable.rb, line 67
def special_unpacking sym, &block
  class_variable_get(:@@special_unpacking)[sym] = block
end
unpack(packing) { |obj| ... } click to toggle source
# File lib/musicality/packable.rb, line 13
def unpack packing
  args = []
  kwargs = {}

  init_params.each do |name,type|
    if (type == :req || type == :keyreq) && !packing.has_key?(name)
      raise ArgumentError, "Packing does not have required key #{name}"
    end

    val = packing[name]
    if type == :keyrest
      raise "Expected this to be a Hash" unless val.is_a? Hash
    end

    val2 = if unpacks_specially?(name)
      unpack_specially(name,val)
    else
      Packable.unpack_val(val)
    end

    case type
    when :req, :opt
      args.push val2
    when :key, :keyreq
      kwargs[name] = val2
    when :keyrest
      kwargs.merge!(val2)
    end
  end
  
  if args.any?
    if kwargs.any?
      obj = new(*args,**kwargs)
    else
      obj = new(*args)
    end
  elsif kwargs.any?
    obj = new(**kwargs)
  else
    obj = new
  end

  block_given? ? yield(obj) : obj
end
unpack_specially(sym, val) click to toggle source
# File lib/musicality/packable.rb, line 83
def unpack_specially sym, val
  class_variable_get(:@@special_unpacking)[sym].call(val)
end
unpacks_specially?(sym) click to toggle source
# File lib/musicality/packable.rb, line 75
def unpacks_specially? sym
  class_variable_get(:@@special_unpacking).has_key?(sym)
end