La mejor manera de manejar el estado sucio en un modelo ORM

No quiero que nadie diga"no debe reinventar la rueda, use un ORM de código abierto"; Tengo un requisito inmediato y no puedo cambiar.

Estoy haciendo un poco de ORM, que admite el almacenamiento en caché. Incluso si no admite el almacenamiento en caché, necesitaría esta función de todos modos, para saber cuándo escribir un objeto en el almacenamiento o no. El patrón es DataMapper.

Aquí está mi enfoque:

Quiero evitar la introspección en tiempo de ejecución (es decir, adivinar atributos).No quiero usar un generador de código CLI para generar captadores y definidores (en realidad uso NetBeans One, ALT + INSERT).Quiero que el modelo sea el más cercano a un POPO (objeto PHP antiguo sin formato). Quiero decir: atributos privados, captadores y definidores "codificados" para cada atributo.

Tengo una clase abstracta llamadaAbstractModel Que todos los modelos heredan. Tiene un método público llamadoisDirty() con un atributo privado (también se puede proteger, si es necesario) llamado is_dirty. Debe devolver verdadero o falso dependiendo de si hay un cambio en los datos del objeto o no desde que se cargó.

El problema es: ¿Hay alguna manera de levantar la bandera interna?"is_dirty" sin codificar en cada setter$this->is_dirty = true? Quiero decir: quiero tener a los setters como$this->attr = $value la mayoría de las veces, excepto que se necesita un cambio de código para la lógica empresarial.

Otra limitación es que no puedo confiar en__set porque en la clase del modelo concreto los atributos ya existen como privados, por lo que__set Nunca se llama a los setters.

¿Algunas ideas? Se aceptan ejemplos de código de otros ORMs.

Una de mis ideas fue modificar la plantilla de los NetBeans, pero creo que debería haber una manera de hacerlo sin confiar en el IDE.

Otro pensamiento que tuve fue crear los configuradores y luego cambiar el nombre del atributo privado con un guión bajo o algo así. De esta manera el setter llamaría a__set y tener algún código allí para hacer frente a la"is_dirty" bandera, pero esto rompe un poco el concepto POPO, y es feo.