def set(variable, *args, &block)
if variable.to_s !~ /^[_a-z]/
raise ArgumentError, "invalid variable `#{variable}' (variables must begin with an underscore, or a lower-case letter)"
end
if !block_given? && args.empty? || block_given? && !args.empty?
raise ArgumentError, "you must specify exactly one of either a value or a block"
end
if args.length > 1
raise ArgumentError, "wrong number of arguments (#{args.length} for 1)"
end
value = args.empty? ? block : args.first
sym = variable.to_sym
protect(sym) { @variables[sym] = value }
end