TINA Is No Acronym. TINA is a config system.
TINA is a self-documenting, easy to use config system with implementations for both Java and Common Lisp.
TINA is designed to be very losely coupled to your code. In practice, you can remove TINA and recompile your code without changing it and expect it to just work. In the Java version, you don't have to change a single line of your code. In the Lisp version you just have to add a single definition to be able to remove the whole of TINA:
(defmacro defconfig (f arg &body body) `(defmethod ,(coerce (concatenate 'string "config-" (string f)) 'symbol) (,arg) ,@body))This loose coupling has a number of benefits:
In addition to the loose coupling between TINA and your code, there is further loose coupling between the way you choose to represent things in your code, and the way a user must configure them. TINA has several strategies for converting configuration data into a form that can be processed by your program. For example TINA gives a user one uniform way of defining a collection of items, but is able to transparently convert such a collection into any data-structure that your code might require (e.g. a linked-list, an array, etc.).
TINA configuration files look basically like series of name/value pairs, with each pair living in a namespace:
(org.abstractnonsense.ExampleNameSpace1 foo = 123.456 bar = "a string" baz = ("A" "collection" "of" "strings") quux = true) ;; Comments are allowed too! (org.abstractnonsense.ExampleNameSpace2 foo = 666 ;; default, decimal bar = #x29A ;; #x prefix, Hex baz = #b1010011010) ;; #b prefix, binary
TINA allows for a large degree of introspection. One can easily get a list of all namespaces recognised by a program, a list of all the configurable parameters within a given namespace, and various pieces of information about a given parameter. This ability to poke around in configurable code makes it easy to do things like automatically generate documentation about what configuration parameters are available and what they do. It would also be trivial, for example, to write a program that took as its input a TINA config file and a compiled Java or Lisp binary, and verified the config file against the binary.
TINA includes a system for generating documentation from compiled Java or Lisp code. Examples of this documentation can be seen here (Java version) and here (Lisp version).
For more information, and the source code, look here.