// Borrowed from http://code.google.com/p/preferscala/ package preferscala; import sbinary._; import sbinary.Operations._; import java.io.File; import java.util.prefs.Preferences; sealed abstract class PreferenceType{ private[preferscala] def nodeForPackage(clazz : Class[_]) : Preferences; private[preferscala] def root : Preferences; } object PreferenceType{ case object User extends PreferenceType{ private[preferscala] def nodeForPackage(clazz : Class[_]) = Preferences.userNodeForPackage(clazz); private[preferscala] def root = Preferences.userRoot; } case object System extends PreferenceType{ private[preferscala] def nodeForPackage(clazz : Class[_]) = Preferences.systemNodeForPackage(clazz); private[preferscala] def root = Preferences.systemRoot; } } abstract class PreferenceGroup{ def underlying : Preferences; class Preference[T](name : String, default : => T)(implicit bin : Format[T]){ private var localCache : T = null.asInstanceOf[T]; def apply() : T = { if (localCache == null){ var bytes = underlying.getByteArray(name, null); if (bytes == null){ localCache = default; } else { localCache = fromByteArray[T](bytes) } } localCache } def update(t : T){ localCache = t; underlying.putByteArray(name, toByteArray[T](t)); } def reset(){ localCache = null.asInstanceOf[T]; underlying.remove(name); underlying.flush(); } def exportToFile(file : File){ toFile(apply())(file); } def loadFromFile(file : File){ update(fromFile[T](file)); } } } class NamedGroup(groupName : String, pt : PreferenceType) extends PreferenceGroup{ val underlying = pt.root.node(groupName); } abstract class PackageGroup(pt : PreferenceType) extends PreferenceGroup{ val underlying = pt.nodeForPackage(getClass); }