TIP 516: More OO Slot Operations

Login
Bounty program for improvements to Tcl and certain Tcl packages.
Author:         Donal K. Fellows <donal.k.fellows@manchester.ac.uk>
State:          Final
Type:           Project
Vote:           Done
Created:        7-Sept-2018
Post-History:   
Tcl-Version:	8.7
Keywords:       Tcl, TclOO
Vote-Results:   4/0/5 accepted
Votes-For:      DKF, JN, JD, AK
Votes-Against:  none
Votes-Present:  BG, KBK, DGP, FV, SL
Tcl-Branch:     tip-516

Abstract

This TIP proposes to add some more operations to slots by updating the class that implements them.

Rationale

Currently slots support setting (i.e., replacing all current slot items with a different list of items), appending (i.e., adding onto the end of the list), and clearing (i.e., setting the list to an empty list); the former two cases are moderated by the need for slot items to be unique, but that is a constraint enforced at the lower level. However, other basic operations are conceivable too, such as prepending an item and removing an item (with the latter needing a little care as it requires normalisation of the slot items). An example of how this last use case might be useful is when removing a behaviour from an object by removing a mixin from it; that's possible to do with the existing code, but quite awkward because it requires replacing the list of slot items with another list, and so it is an operation that we should provide by default.

Proposal

This will add two new methods to the ::oo::Slot class:

  • slot -prepend ?item ...?

    This inserts the item (or items) at the front of the list of items in the slot. If there are no such arguments given, this does nothing; it is not an error to prepend no items.

  • slot -remove ?item ...?

    This removes the item (or items) from the list of items in the slot. If an item is not present in the slot, this does nothing; it is not an error to remove a non-present item. If there are no such items in the arguments, this does nothing; it is not an error to remove no items.

To support this, an extra internal operation is added:

  • slot Resolve slotElement

    This returns the slotElement with a resolution operation applied to it. The meaning of this operation will depend on the kind of values held in a particular slot, but for a slot of classes then the relevant type of resolution would be command resolution. (The main slot method implementation classes will ensure that this method is always called in a context where the resolution context is that of the caller.)

Implementation

See the tip-516 branch.

Copyright

This document has been placed in the public domain.

History