Yesterday when I was thinking about that enumerators I had an idea for a 
language feature and something which I saw introduced in Objective-C some years 
ago.

Retaining of a member variable through a property is a common pattern I do 
everyday nearly. In my root class I manage a simply retain count which frees 
the object when it reaches 0. When assigning variables that the receiver wants 
to take ownership of on assignment I have to make an accessor which manages the 
retain count of the object (boring boiler plate).

Consider the example below where the root class (TObject) overrides a class 
function which performs this retain count management (ManageObject). In the 
other class there is a member of type TObject which TMyClass will take 
ownership of when assigned. If the property “Data” includes the “managed” 
keyword the compiler will automatically call ClassType.ManageObject() and take 
the return value as the variable which is written to “m_data”.

I’ve been wanting to learn how to contribute to the compiler for years now but 
maybe this is an easy enough project to start with. I don’t know if this is  a 
problem people have though but I assume it may be since Objective-C had a 
system like for memory management and properties. What do you think? How do 
most FPC programmers handle memory these days?

type
        TObject = class
                class function ManageObject (obj: pointer): TObject; override;  
        end;

type
        TMyClass = class (TObject)
                private
                        m_data: TObject;
                public
                        property Data: TObject read m_data write m_data; 
managed;
                        // if there’s a write method defined the compiler calls 
ManageObject before the write method
                        property MyData: TObject read m_data write SetData; 
managed;
        end;

class function TObject.ManageObject (obj: pointer): TObject; override;
begin
        if obj <> nil then
                result := TObject(obj).Retain;
        else
                begin
                        TObject(obj).Release;
                        result := nil;
                end;
end;

Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to