[fpc-pascal] Intercept call to a property, method or attribute
Joao Morais
jcmoraisjr at gmail.com
Sun Mar 3 18:03:09 CET 2013
Hello list. I need to implement lazy loading for an OPF so I need to
intercept the read call to a property. Lets take the following
classes:
TClient = class
private
FName: string;
published
property Name: string read FName write FName;
end;
TInvoice = class
private
FClient: TClient;
published
property Client: TClient read FClient write FClient;
end;
Tinvoice.Client need to be checked by the OPF before return its actual value.
Some approaches I have outlined so far:
1. A future aspect implementation: so I can verify the Client property
just before the value is returned to the caller.
2. A future (if possible) proxy (like Java proxy) implementation: so
the OPF can place a "fake" TClient instance in the client property,
and intercept calls to the Client instance. Just like Hibernate
actually do.
3. A proxy object between TInvoice and TClient is possible today, with
some effort from the user:
TInvoice = class
private
FClient: specialize TProxy<TClient>;
published
property Client: TClient read GetClient write SetClient;
end;
GetClient: Result := FClient.GetValue;
SetClient: FClient.SetInstance(AValue);
4. Finally a manual check is also possible and it's currently my
preferred approach, but also with some effort from the user:
TInvoice = class
private
FClient: TClient;
published
property Client: TClient read GetClient write FClient;
end;
GetClient: somecheck(Self, @FClient); Result := FClient;
Is there some compiler magic I am missing?
Joao Morais
More information about the fpc-pascal
mailing list