Data model! Dynamic data lookup should opportunisticly cache any associated cheap data. For instance, there are three data from stat(/srv/git/$reponame.git), so looking up one should grab the others. /etc/password parsing would be similar. [[!table format=dsv delimiter=# data=""" datum #stored location #constraint username #usually $ENV{SUDO_USER} #!~ /^git-|^ikiwiki-/ and =~ /^[a-zA-Z0-9_.][a-zA-Z0-9_.-]+$/ uid #/etc/passwd #None email #/etc/passwd GECOS #Email::Valid::Loose->new( "-fqdn" => 1, "-fudge" => 0, "-local_rules" => 0, "-mxcheck" => 1, "-tldcheck" => 0 ); repoaccess #/etc/group git-$reponame entry #None reponame #/srv/git/$reponame.git #=~ /^[a-z0-9][a-z0-9+.-]+$/ repodescription #/srv/git/$reponame.git/description #=~ /^[\x{0020}-\x{FDCF}\x{FDF0}-\x{FFFD}]{1,80}$/ repoowner #stat /srv/git/$reponame.git uid; might be better as first non-ikiwiki user in /etc/group git-$reponame entry #None repoglobalwritable #stat /srv/git/$reponame.git all write bit #None repoglobalreadable #stat /srv/git/$reponame.git all read bit #None repoikiwikidisable #UNDECIDED; probably in /srv/git/$reponame.git #None repointernaltemplates #UNDECIDED; probably in /srv/git/$reponame.git #None repospecialdomain #UNDECIDED; probably in /srv/git/$reponame.git #None """]]