CLEAR loParameter = CREATEOBJECT( "Custom" ) loParameter.AddProperty( "MyString", "HelloWorld" ) lcFooBar = "FooBar" * Objects always passed by reference, also pass lcFooBar by ref: ? "Initial local variable values:" ? loParameter.MyString, lcFooBar ? ? "Initial child object values as passed in byref:" loMyChild = CREATEOBJECT( "MyChild", loParameter, @lcFooBar ) loParameter.MyString = "HelloWorld2" lcFooBar = "FooBar2" ? ? "Child object values after local variables are changed:" loMyChild.MyPrint( ) ? "Why is the second child object value not FooBar2?" * RELEASE command below does not throw any error RELEASE loParameter, lcFooBar ? ? "After RELEASEing the local vars:" ? "VARTYPE( loParameter ) = " + VARTYPE( loParameter ) ? "VARTYPE( lcFooBar ) = " + VARTYPE( lcFooBar ) loMyChild.MyPropsUpdate( ) ? ? "After child object updates its own values:" loMyChild.MyPrint( ) RETURN DEFINE CLASS MyChild AS Custom MyPORef = "" MyVarRef = .NULL. FUNCTION Init LPARAMETERS toParameter, tcFooBar This.MyPORef = toParameter This.MyVarRef = tcFooBar =This.MyPrint( ) ENDFUNC FUNCTION MyPrint ? This.MyPORef.MyString, This.MyVarRef ENDFUNC FUNCTION MyPropsUpdate This.MyPORef.MyString = "HelloWorld3" This.MyVarRef = "FooBar3" ENDFUNC ENDDEFINEFor objects, it looks like the key concept is you are only ever dealing with references, not the object itself. RELEASE loSomeObject only releases an in-scope reference. Once the reference count drops to zero, the GC can finally remove the underlying object.