def resolves_attributes *args
if (args = args.fetch 0, true).respond_to? :to_sym
args = [args]
end unless args.size > 1
case args
when true
option :pos_attrs, []
option :default_attrs, {}
when ::Array
names, defaults = [], {}
args.each do |arg|
if (arg = arg.to_s).include? '='
name, value = arg.split '=', 2
if name.include? ':'
idx, name = name.split ':', 2
idx = idx == '@' ? names.size : idx.to_i
names[idx] = name
end
defaults[name] = value
elsif arg.include? ':'
idx, name = arg.split ':', 2
idx = idx == '@' ? names.size : idx.to_i
names[idx] = name
else
names << arg
end
end
option :pos_attrs, names.compact
option :default_attrs, defaults
when ::Hash
names, defaults = [], {}
args.each do |key, val|
if (name = key.to_s).include? ':'
idx, name = name.split ':', 2
idx = idx == '@' ? names.size : idx.to_i
names[idx] = name
end
defaults[name] = val if val
end
option :pos_attrs, names.compact
option :default_attrs, defaults
else
raise ::ArgumentError, %(unsupported attributes specification for macro: #{args.inspect})
end
end