RClassUtils {methods} | R Documentation |
These are various functions to support the definition and use of formal classes. Most of them are rarely suitable to be called directly.
Others are somewhat experimental and/or partially implemented only. Do
refer to setClass
for normal code development.
testVirtual(properties, extends, prototype, where) makePrototypeFromClassDef(slots, ClassDef, extends, where) newEmptyObject() completeClassDefinition(Class, ClassDef, where, doExtends) getSlots(x) getAllSuperClasses(ClassDef, simpleOnly = TRUE) superClassDepth(ClassDef, soFar, simpleOnly = TRUE) isVirtualClass(Class, where) newBasic(Class, ...) makeExtends(Class, to, coerce, test, replace, by, package, slots, classDef1, classDef2) reconcilePropertiesAndPrototype(name, properties, prototype, superClasses, where) tryNew(Class, where) trySilent(expr) empty.dump() showClass(Class, complete=TRUE, propertiesAreCalled="Slots") showExtends(ext, printTo = stdout()) possibleExtends(class1, class2, ClassDef1 = getClassDef(class1), ClassDef2 = getClassDef(class2, where = .classEnv(ClassDef1))) completeExtends(ClassDef, class2, extensionDef, where) classMetaName(name) methodsPackageMetaName(prefix, name) metaNameUndo(strings, prefix = "M", searchForm = FALSE) requireMethods(functions, signature, message, where) checkSlotAssignment(obj, name, value) defaultPrototype() isClassDef(object) validSlotNames(names) getDataPart(object) setDataPart(object, value)
testVirtual
:"VIRTUAL"
.
Otherwise, a class is virtual only if it has no slots, extends no
non-virtual classes, and has a NULL
Prototype.
makePrototypeFromClassDef
:The following three rules are applied in this order.
ClassDef
, if there is
one, is used instead (but it must be coercible to the class of
the slot). This includes the data part (".Data"
slot) if
there is one.
If all three of the above fail, the prototype is NULL
.
newEmptyObject
:
Currently just creates an empty list with class "NULL"
.
Later version should create a special object reference that marks an object currently with no slots and no data.
completeClassDefinition
:Class
, relative to the class
definitions visible from environment where
. If
doExtends
is TRUE
, complete the super- and
sub-class information.
This function is called when a class is defined or re-defined.
getFromClassDef
:getSlots
:x
can either be the name of
a class or the class definition object.
getAllSuperClasses
, superClassDepth
:
getAllSuperClasses
is a utility function used to complete a
class definition. It returns all the superclasses reachable from
this class, in breadth-first order (which is the order used for
matching methods); that is, the first direct superclass followed
by all its superclasses, then the next, etc. (The order is
relevant only in the case that some of the superclasses have
multiple inheritance.)
superClassDepth
, which is called from
getAllSuperClasses
, returns the same information, but as a
list with components label
and depth
, the latter for
the number of generations back each class is in the inheritance
tree. The argument soFar
is used to avoid loops in the
network of class relationships.
isVirtualClass
:A class is virtual if explicitly declared to be, and also if the class is not formally defined.
assignClassDef
:newBasic
:new
for basic classes
that don't have a formal definition.
Any of these could have a formal definition, except for
Class="NULL"
(disallowed because NULL
can't have
attributes). For all cases except "NULL"
, the class of the
result will be set to Class
.
See new
for the interpretation of the arguments.
makeExtends
:reconcilePropertiesAndPrototype
:
Specifically, returns a structure with attributes corresponding to
the slot names in properties and values taken from prototype if
they exist there, from new(classi)
for the class,
classi
of the slot if that succeeds, and NULL
otherwise.
The prototype may imply slots not in the properties list, since properties does not include inherited slots (these are left unresolved until the class is used in a session).
tryNew
:NULL
.
This is inefficient and also not a good idea when actually generating objects, but is useful in the initial definition of classes.
showClass
:
If complete
is TRUE
, include the indirect
information about extensions.
showExtends
:printTo = FALSE
,
returns a list with components what
and how
; this is
used e.g., by promptClass()
.
possibleExtends
:
This can be either a logical value or an object of class
SClassExtension-class
containing various
functions to test and/or coerce the relationship.
completeExtends
:
If class2
and extensionDef
are included, this
class relation is to be added. Otherwise just use the current
ClassDef
.
Both the contains
and subclasses
slots are
completed with any indirect relations visible.
classMetaName
:methodsPackageMetaName
:metaNameUndo
ObjectsWithPackage-class
.
requireMethods
:
For each generic, setMethod
will be called to define a
method that throws an error, with the supplied message.
The requireMethods
function allows virtual classes to
require actual classes that extend them to implement methods for
certain functions, in effect creating an API for the virtual class.
Otherwise, default methods for the corresponding function would be called, resulting in less helpful error messages or (worse still) silently incorrect results.
checkSlotAssignment
:
For privileged slots (those that can only be set by accesor
functions defined along with the class itself), the class designer
may choose to improve efficiency by validating the value to be
assigned in the accessor function and then calling slot<-
with the argument check=FALSE
, to prevent the call to
checkSlotAssignment
.
defaultPrototype
:.InitBasicClasses
, .InitMethodsListClass
, .setCoerceGeneric
:.First.lib
.
isClassDef
:object
a representation of a class?
validSlotNames
:names
unless one of the names is reserved, in which
case there is an error. (As of writing, "class"
is the
only reserved slot name.)
getDataPart
, setDataPart
:object@.Data
.