Yep, putting everything in BrianGlobalPreferences would probably be a good idea.

For direct setting of preferences, I hadn't quite decided how it should work. The thing is that in the config file, you basically set a string, whereas in code it would be more natural to set a value directly. How should this work with the validation function stuff? One option would be to change the validation functions so that instead of taking a string argument, they take a value and return true or false (as previously), and we simply eval() the strings to get an object. The only problem is then you can't write core.weave_compiler=gcc you have to write core.weave_compiler='gcc'. Another option is that when the user writes brian_prefs['core.weave_compiler']=X we pass repr(X) to the validation function, but then it relies on the repr function behaving as it should. Still, for all the built in types that would work, so perhaps that's the best option?