Wie so viele andere auch, war ich vor CF9 gewohnt in Datenbeans eine "Instance"-Struktur als Memento-Speicher für die instanzierten Daten eines Objekts aufzubauen. Die Instance-Struktur ist sehr praktisch. Lässt sich doch mit einer Methode getMemento() die aktuellen Eigenschaftwerte der Instanz zur Laufzeit auslesen. Das ist äusserst hilfreich beim Debuggen oder auch um die Daten an einen AJAX-Request oder in eine Form zurückzuspielen.

Beispiel vor CF9:

In CF9 haben wir ja jetzt implizite Getter/Setter. Die müssen also nicht mehr extra geschrieben werden, was kaum jemand beklagen dürfte, zumal sie ja immer auch überschrieben werden können. Gespeichert werden die Eigenschaftswerte zur Laufzeit aber im Variables-Scope. Das direkte Auslesen der gesamte Instanzdaten wird dadurch erschwert. Schöne wäre IMHO, Instanzdaten hätten einem eignen Scope, aber der This-Scope bezeichnet in CFML leider eine ganz andere Funktion als in Java.

Trotzdem lassen sich aber mit den Metadaten der Properties die Laufzeitdaten auslesen. Auf "Adobe Cookbook" findet sich denn auch bereits eine Funktion, die genau dies macht:

So weit so gut, doch was passiert, wenn im Klassendesign Vererbung benutzt wird? Obige Funktion berücksichtigt das nicht. Da erinnerte ich mich doch an meine noch mit CF6 geschriebene Activce-Record Persistancekomponente. Auch dort lese ich die Laufzeitwerte über die Metadaten des <cfproperty> Tags aus - aber rekursive, um auch die vererbten Eigenschaften auszulesen. Also ab ins eigene Code-Depot... 

Unten nun der für CF9 angepasste Code. Er liesst Instance-Daten auch aus vererbten Objekten aus. Um die Methode übergreifend in allen Entity-Objekten zu verwenden, erstellte ich eine Abstrakte Klassen, von der sich alle Entities ableiten.