# TIP 550: Garbage Collection for TclOO
	Author:         Donal K. Fellows <donal.k.fellows@manchester.ac.uk>
	State:          Draft
	Type:           Project
	Vote:           Pending
	Created:        11-Jun-2019
	Post-History: 
	Tcl-Version:    9.1
	Keywords:       Tcl, memory
-----

# Abstract

This TIP changes the semantics of Tcl and TclOO so that objects can be
reclaimed automatically when they are no longer referenced.

# Rationale

One of the use patterns that people use TclOO for is to create relatively
short-lived objects that manage other things. Currently doing this requires
remembering to explicitly delete the objects once they are no longer needed,
usually by calling their `destroy` method, but this is comparatively
onerous. If we instead adopt a garbage collection mechanism, we can move
instead to deleting objects once they are no longer referenced by the rest of
the program; this is a reasonable fit for objects whose name is not
predetermined, as their name needs to be saved into a variable (or put inside
a list or other data-containing value) already in order for them to be usable.

# Specification

When the **new** method of **oo::class** is called (and hence by default for
any class that doesn't override it), it picks a new unused name currently.
This behaviour shall be extended so that when the final reference from Tcl
code to that name is lost (which shall be determined through mechanisms such
as reference counting) the object will be deleted.

Each use of `self object` (or its common alias `self`) within the object shall
create another reference to the object. Looking it up through mechanisms such
as `info class instances` shall create another reference to the object (while
it exists).

Renaming a garbage-collectable object (to any name) stops it from being
garbage collected, just as if it had been manufactured with **create**.
Objects with explicit names (which includes all classes themselves under
normal circumstances) are assumed to be not garbage collected, as the names
could be used in source code directly, without having been obtained from a
creation method.

Instances may also be explicitly deleted through all existing mechanisms.
After that, those existing references will be treated as if they were plain
strings.

# Implementation

To be done.

# Copyright

This document is placed in public domain.
