--- /dev/null
+/* jshint node:true */
+
+'use strict';
+
+var fs = require('fs'),
+ path = require('path'),
+ safe = require('safetydance'),
+ _ = require('underscore');
+
+exports = module.exports = {
+ clear: clear,
+ set: set,
+ get: get,
+ unset: unset,
+ has: has,
+
+ // convenience
+ server: function () { return get('server'); }
+};
+
+var HOME = process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
+var CONFIG_FILE_PATH = path.join(HOME, '.surfer.json');
+
+var gConfig = (function () {
+ return safe.JSON.parse(safe.fs.readFileSync(CONFIG_FILE_PATH)) || {};
+})();
+
+function save() {
+ fs.writeFileSync(CONFIG_FILE_PATH, JSON.stringify(gConfig, null, 4));
+}
+
+function clear() {
+ safe.fs.unlinkSync(CONFIG_FILE_PATH);
+}
+
+function set(key, value) {
+ if (typeof key === 'object') {
+ _.extend(gConfig, key);
+ } else {
+ safe.set(gConfig, key, value);
+ }
+ save();
+}
+
+function get(key) {
+ return safe.query(gConfig, key);
+}
+
+function unset(key /*, .... */) {
+ for (var i = 0; i < arguments.length; i++) {
+ gConfig = safe.unset(gConfig, arguments[i]);
+ }
+
+ save();
+}
+
+function has(key /*, ... */) {
+ for (var i = 0; i < arguments.length; i++) {
+ if (!(arguments[i] in gConfig)) return false;
+ }
+ return true;
+}