@Hugo: Buiten de punten die ik als programmeur zelf niet zou doen als DATA -> XML -> XSLT render omdat dit zwaar overkill is.
Ik ken deze techniek wel, maar dat is dat je de database zelf (hallo PostgreSQL) de XML laat aanmaken en terugsturen en dan vervolgens dat renderd. Als je een template systeem wilt gebruiken wat automatisch escaped zou ik Twig aanbevelen.
Banshee mist op dit moment nog bepaalde onderdelen, die juist Drupal en Joomla! zo populair maken op gebied van CMS.
Namelijk de actieve community, wat gelijk de kracht en last is van deze systemen.
Iemand kan een goede plugin maken die uitstekend werkt, of iets dat zo slecht werkt en zo onveilig is als het maar kan.
En als Framework is het weer te zwak als je het vergelijkt met Zend Framework, Symfony 2 (Symfony CMF voor CMS), CakePHP, Kohana of Code Ignitor. Kleine websites kunnen hier nog wel wat mee, maar bij grote projecten schiet al snel te kort. Maar dit natuurlijk afhankelijk van je doelgroep.
Maar omdat ik niet alleen wil bekritiseren, wil ik ook een paar tips geven.
* Steeds meer mensen maken gebruik van Composer voor dependency management.
* PostgreSQL heeft sinds 9.2 een speciale optie voor format() waarmee je %i kan meegeven voor indentifier met automatische escaping. Allicht interessant om deze techniek over te nemen ;)
http://www.postgresql.org/docs/current/static/functions-string.html
Format a string. This function is similar to the C function sprintf; but only the following conversion specifications are recognized: %s interpolates the corresponding argument as a string; %I escapes its argument as an SQL identifier; %L escapes its argument as an SQL literal; %% outputs a literal %. A conversion can reference an explicit parameter position by preceding the conversion specifier with n$, where n is the argument position. See also Example 39-1.
* Gebruik geen output buffering voor alles, dit werkt vertragend en is eigenlijk niet meer nodig als je een goede template engine gebruikt.
* Strip alle leading ?> van php-only bestanden, dit verwijderd ook de noodzaak van output buffering.
* Magic methos __set/get() zijn 50% langzamer dan gewone setters en getters. gebruik dan gewoon set() en get() zonder magie.
Ps. De mail functionaliteit breekt op een klein punt met de standaards, regels moeten worden verdeeld met \n\r niet \n
Verder dan dat heb je beter je best gedaan dan menig mail functionaliteit programmeur, ik weet hoe immens ingewikkeld dit kan zijn :)