- NAME
- Tcl_ClassSetConstructor, Tcl_ClassSetDestructor,
Tcl_MethodDeclarerClass, Tcl_MethodDeclarerObject,
Tcl_MethodIsPublic, Tcl_MethodIsPrivate, Tcl_MethodIsType,
Tcl_MethodName, Tcl_NewInstanceMethod, Tcl_NewMethod,
Tcl_ObjectContextInvokeNext, Tcl_ObjectContextIsFiltering,
Tcl_ObjectContextMethod, Tcl_ObjectContextObject,
Tcl_ObjectContextSkippedArgs — manipulate methods and method-call
contexts
- SYNOPSIS
- #include <tclOO.h>
- Tcl_Method
- Tcl_NewMethod(interp, class, nameObj, flags,
methodTypePtr,
- clientData)
- Tcl_Method
- Tcl_NewInstanceMethod(interp, object, nameObj, flags,
methodTypePtr,
- clientData)
- Tcl_ClassSetConstructor(interp, class,
method)
- Tcl_ClassSetDestructor(interp, class,
method)
- Tcl_Class
- Tcl_MethodDeclarerClass(method)
- Tcl_Object
- Tcl_MethodDeclarerObject(method)
- Tcl_Obj *
- Tcl_MethodName(method)
- int
- Tcl_MethodIsPublic(method)
- int
- Tcl_MethodIsPrivate(method)
- int
- Tcl_MethodIsType(method, methodTypePtr,
clientDataPtr)
- int
- Tcl_ObjectContextInvokeNext(interp, context, objc,
objv, skip)
- int
- Tcl_ObjectContextIsFiltering(context)
- Tcl_Method
- Tcl_ObjectContextMethod(context)
- Tcl_Object
- Tcl_ObjectContextObject(context)
- Tcl_Size
- Tcl_ObjectContextSkippedArgs(context)
- ARGUMENTS
- DESCRIPTION
- METHOD
CREATION
- METHOD CALL
CONTEXTS
- METHOD
TYPES
- TCL_METHODCALLPROC FUNCTION SIGNATURE
- TCL_METHODDELETEPROC FUNCTION SIGNATURE
- TCL_CLONEPROC
FUNCTION SIGNATURE
- REFERENCE COUNT
MANAGEMENT
- SEE
ALSO
- KEYWORDS
Tcl_ClassSetConstructor, Tcl_ClassSetDestructor,
Tcl_MethodDeclarerClass, Tcl_MethodDeclarerObject,
Tcl_MethodIsPublic, Tcl_MethodIsPrivate, Tcl_MethodIsType,
Tcl_MethodName, Tcl_NewInstanceMethod, Tcl_NewMethod,
Tcl_ObjectContextInvokeNext, Tcl_ObjectContextIsFiltering,
Tcl_ObjectContextMethod, Tcl_ObjectContextObject,
Tcl_ObjectContextSkippedArgs — manipulate methods and method-call
contexts
#include <tclOO.h>
Tcl_Method
Tcl_NewMethod(interp, class, nameObj, flags,
methodTypePtr,
clientData)
Tcl_Method
Tcl_NewInstanceMethod(interp, object, nameObj, flags,
methodTypePtr,
clientData)
Tcl_ClassSetConstructor(interp, class, method)
Tcl_ClassSetDestructor(interp, class, method)
Tcl_Class
Tcl_MethodDeclarerClass(method)
Tcl_Object
Tcl_MethodDeclarerObject(method)
Tcl_Obj *
Tcl_MethodName(method)
int
Tcl_MethodIsPublic(method)
int
Tcl_MethodIsPrivate(method)
int
Tcl_MethodIsType(method, methodTypePtr,
clientDataPtr)
int
Tcl_ObjectContextInvokeNext(interp, context, objc, objv,
skip)
int
Tcl_ObjectContextIsFiltering(context)
Tcl_Method
Tcl_ObjectContextMethod(context)
Tcl_Object
Tcl_ObjectContextObject(context)
Tcl_Size
Tcl_ObjectContextSkippedArgs(context)
- Tcl_Interp *interp (in/out)
- The interpreter holding the object or class to create or update
a method in.
- Tcl_Object object
(in)
- The object to create the method in.
- Tcl_Class class
(in)
- The class to create the method in.
- Tcl_Obj *nameObj
(in)
- The name of the method to create. Should not be NULL unless
creating constructors or destructors.
- int flags (in)
- A flag saying (currently) what the visibility of the method is.
The supported public values of this flag are
TCL_OO_METHOD_PUBLIC (which is fixed at 1 for backward
compatibility) for an exported method,
TCL_OO_METHOD_UNEXPORTED (which is fixed at 0 for backward
compatibility) for a non-exported method, and
TCL_OO_METHOD_PRIVATE for a private method.
- Tcl_MethodType *methodTypePtr (in)
- A description of the type of the method to create, or the type
of method to compare against.
- void *clientData (in)
- A piece of data that is passed to the implementation of the
method without interpretation.
- void **clientDataPtr (out)
- A pointer to a variable in which to write the clientData
value supplied when the method was created. If NULL, the
clientData value will not be retrieved.
- Tcl_Method method (in)
- A reference to a method to query.
- Tcl_ObjectContext context (in)
- A reference to a method-call context. Note that client code
must not retain a reference to a context.
- Tcl_Size objc (in)
- The number of arguments to pass to the method
implementation.
- Tcl_Obj *const *objv
(in)
- An array of arguments to pass to the method
implementation.
- Tcl_Size skip (in)
- The number of arguments passed to the method implementation
that do not represent "real" arguments.
A method is an operation carried out on an object that is
associated with the object. Every method must be attached to either
an object or a class; methods attached to a class are associated
with all instances (direct and indirect) of that class.
Given a method, the entity that declared it can be found using
Tcl_MethodDeclarerClass which returns the class that the
method is attached to (or NULL if the method is not attached to any
class) and Tcl_MethodDeclarerObject which returns the object
that the method is attached to (or NULL if the method is not
attached to an object). The name of the method can be retrieved
with Tcl_MethodName, whether the method is exported is
retrieved with Tcl_MethodIsPublic, and whether the method is
private is retrieved with Tcl_MethodIsPrivate. The type of
the method can also be introspected upon to a limited degree; the
function Tcl_MethodIsType returns whether a method is of a
particular type, assigning the per-method clientData to the
variable pointed to by clientDataPtr if (that is non-NULL)
if the type is matched.
Methods are created by Tcl_NewMethod and
Tcl_NewInstanceMethod, which create a method attached to a
class or an object respectively. In both cases, the nameObj
argument gives the name of the method to create, the flags
argument states whether the method should be exported initially or
be marked as a private method, the methodTypePtr argument
describes the implementation of the method (see the METHOD TYPES section below) and the clientData
argument gives some implementation-specific data that is passed on
to the implementation of the method when it is called.
When the nameObj argument to Tcl_NewMethod is
NULL, an unnamed method is created, which is used for constructors
and destructors. Constructors should be installed into their class
using the Tcl_ClassSetConstructor function, and destructors
(which must not require any arguments) should be installed into
their class using the Tcl_ClassSetDestructor function.
Unnamed methods should not be used for any other purpose, and named
methods should not be used as either constructors or destructors.
Also note that a NULL methodTypePtr is used to provide
internal signaling, and should not be used in client code.
When a method is called, a method-call context reference is passed
in as one of the arguments to the implementation function. This
context can be inspected to provide information about the caller,
but should not be retained beyond the moment when the method call
terminates.
The method that is being called can be retrieved from the
context by using Tcl_ObjectContextMethod, and the object
that caused the method to be invoked can be retrieved with
Tcl_ObjectContextObject. The number of arguments that are to
be skipped (e.g. the object name and method name in a normal method
call) is read with Tcl_ObjectContextSkippedArgs, and the
context can also report whether it is working as a filter for
another method through Tcl_ObjectContextIsFiltering.
During the execution of a method, the method implementation may
choose to invoke the stages of the method call chain that come
after the current method implementation. This (the core of the
next command) is done
using Tcl_ObjectContextInvokeNext. Note that this function
does not manipulate the call-frame stack, unlike the next command; if the method
implementation has pushed one or more extra frames on the stack as
part of its implementation, it is also responsible for temporarily
popping those frames from the stack while the
Tcl_ObjectContextInvokeNext function is executing. Note also
that the method-call context is never deleted during the
execution of this function.
The types of methods are described by a pointer to a Tcl_MethodType
structure, which is defined as:
typedef struct {
int version;
const char *name;
Tcl_MethodCallProc *callProc;
Tcl_MethodDeleteProc *deleteProc;
Tcl_CloneProc *cloneProc;
} Tcl_MethodType;
The version field allows for future expansion of the
structure, and should always be declared equal to
TCL_OO_METHOD_VERSION_CURRENT. The name field provides a
human-readable name for the type, and is the value that is exposed
via the info class methodtype and info object
methodtype Tcl commands.
The callProc field gives a function that is called when
the method is invoked; it must never be NULL.
The deleteProc field gives a function that is used to
delete a particular method, and is called when the method is
replaced or removed; if the field is NULL, it is assumed that the
method's clientData needs no special action to delete.
The cloneProc field is either a function that is used to
copy a method's clientData (as part of Tcl_CopyObjectInstance) or NULL to
indicate that the clientData can just be copied
directly.
Functions matching this signature are called when the method is
invoked.
typedef int Tcl_MethodCallProc(
void *clientData,
Tcl_Interp *interp,
Tcl_ObjectContext objectContext,
int objc,
Tcl_Obj *const *objv);
The clientData argument to a Tcl_MethodCallProc is the
value that was given when the method was created, the interp
is a place in which to execute scripts and access variables as well
as being where to put the result of the method, and the objc
and objv fields give the parameter objects to the method.
The calling context of the method can be discovered through the
objectContext argument, and the return value from a
Tcl_MethodCallProc is any Tcl return code (e.g. TCL_OK,
TCL_ERROR).
Functions matching this signature are used when a method is
deleted, whether through a new method being created or because the
object or class is deleted.
typedef void Tcl_MethodDeleteProc(
void *clientData);
The clientData argument to a Tcl_MethodDeleteProc will be
the same as the value passed to the clientData argument to
Tcl_NewMethod or Tcl_NewInstanceMethod when the
method was created.
Functions matching this signature are used to copy a method when
the object or class is copied using Tcl_CopyObjectInstance (or
oo::copy).
typedef int Tcl_CloneProc(
Tcl_Interp *interp,
void *oldClientData,
void **newClientDataPtr);
The interp argument gives a place to write an error
message when the attempt to clone the object is to fail, in which
case the clone procedure must also return TCL_ERROR; it should
return TCL_OK otherwise. The oldClientData field to a
Tcl_CloneProc gives the value from the method being copied from,
and the newClientDataPtr field will point to a variable in
which to write the value for the method being copied to.
The nameObj argument to Tcl_NewMethod and
Tcl_NewInstanceMethod (when non-NULL) will have its
reference count incremented if there is no existing method with
that name in that class/object.
The result of Tcl_MethodName is a value with a reference
count of at least one. It should not be modified without first
duplicating it (with Tcl_DuplicateObj).
The values in the first objc values of the objv
argument to Tcl_ObjectContextInvokeNext are assumed to have
a reference count of at least 1; the containing array is assumed to
endure until the next method implementation (see next) returns. Be aware that methods
may yield; if any
post-call actions are desired (e.g., decrementing the reference
count of values passed in here), they must be scheduled with
Tcl_NRAddCallback.
The callProc of the Tcl_MethodType structure takes
values of at least reference count 1 in its objv argument.
It may add its own references, but must not decrement the reference
count below that level; the caller of the method will decrement the
reference count once the method returns properly (and the reference
will be held if the method yields).
Class, NRE, oo::class, oo::define, oo::object
constructor, method, object
Copyright © 2007 Donal K. Fellows