In other dynamic languages, this kind of behavior would be called duck typing. Imagine we have an object x that is of some reference class. This object has a tree structure, and each node in the tree has a parent and children. However, the methods to fetch a node's parent or its children may have arbitrary names. These names are stored in treeSkeleton's parent_caller and children_caller fields. Thus, if x$methods() refers to x's children and x$parent_method() refers to x's parent, we could define a treeSkeleton for x by writing treeSkeleton$new(x, 'parent_method', 'methods').

treeSkeleton_

Details

The iterators on a treeSkeleton use the standard definition of successor, predecessor, ancestor, etc.