class BinData::AcceptedParameters

mandatory, optional, default or mutually exclusive.
allow a BinData class to declaratively identify accepted parameters as
BinData objects accept parameters when initializing. AcceptedParameters

def all

def all
  (@mandatory + @optional + @default.keys).uniq
end

def default(args = {})

def default(args = {})
  if not args.empty?
    ensure_valid_names(args.keys)
    args.each_pair do |param, value|
      @default[param.to_sym] = value
    end
  end
  @default.dup
end

def ensure_valid_names(names)

def ensure_valid_names(names)
  invalid_names = LazyEvaluator.instance_methods(true) +
                    Kernel.methods - ["type"]
  names.each do |name|
    name = name.to_s
    if invalid_names.include?(name)
      raise NameError.new("Rename parameter '#{name}' " +
                          "as it shadows an existing method.", name)
    end
  end
end

def initialize(ancestor_params = nil)

def initialize(ancestor_params = nil)
  @mandatory = ancestor_params ? ancestor_params.mandatory : []
  @optional  = ancestor_params ? ancestor_params.optional  : []
  @default   = ancestor_params ? ancestor_params.default   : Hash.new
  @mutually_exclusive = ancestor_params ?
                                 ancestor_params.mutually_exclusive : []
end

def mandatory(*args)

def mandatory(*args)
  if not args.empty?
    ensure_valid_names(args)
    @mandatory.concat(args.collect { |arg| arg.to_sym })
    @mandatory.uniq!
  end
  @mandatory.dup
end

def mutually_exclusive(*args)

def mutually_exclusive(*args)
  arg1, arg2 = args
  if arg1 != nil && arg2 != nil
    @mutually_exclusive.push([arg1.to_sym, arg2.to_sym])
    @mutually_exclusive.uniq!
  end
  @mutually_exclusive.dup
end

def optional(*args)

def optional(*args)
  if not args.empty?
    ensure_valid_names(args)
    @optional.concat(args.collect { |arg| arg.to_sym })
    @optional.uniq!
  end
  @optional.dup
end