[Xotcl] getter

Stefan Sobernig stefan.sobernig at wu.ac.at
Tue Jan 18 16:20:28 CET 2011


Krzysztof;

> I need an example of implementation of a getter.
> I have an attribute in a class which now needs a customized getter.
> Class A -slots {
> Attribute attr -proc get {domain var} {
> #how to get attr value here? if I do [my attr] I get recursive call.
> $attr says that there is no such variable
> }
> }

Remember: in get(), you are in the object scope of the managing object 
(the attribute slot) and *not* the managed object which is the actuall 
value store, e.g.:
Class A -slots {
   Attribute attr -proc get {domain var} {
     #
     # NB: Here, you are in the scope of the managing object, the value
     # needs to be retrieved from the managed one, i.e. the domain
     # object!
     #
     # $domain instvar $var
     # if {[info exists $var]} {
     #  return [incr $var]
     # }
     set value [next]
     return [incr value]
   } -valuecmd {
     #
     # whenenever /domain/.attr is accessed (read), this script is
     # evaluated and the object variable is (re-) set to its return
     # value, i.e.: 0
     #
     set return 0; # do not use "return"!
   }
}

A create a -attr 1
a attr; # yields '1', though one might expect '2'; interaction of 
valuecmd + get()
a attr 10
a set attr; # yields '0' --> valuecmd only

Depending on what kind of "refinement" you want to achieve, you may 
either replace the original (provided) get() or you go for a method 
combination by using [next].

> Another question: should I use -proc get or -proc valuecmd? valuecmd
> does seems to be not called at all.

well, hard to tell as I don't know exactly what you are after. But, my 
uneducated guess is that get() is your friend.

valuecmd() & co. are hook methods which are invoked upon in certain 
phases of object state access or mutation. while at first sight they 
might appear idempotent, they are not:

1. get() is invoked only when you access an object's state through the 
attribute interface, e.g.: [a attr]. valuecmd is fired always, whenever 
trying to access the object variable, whether through [a attr] or [a set 
attr].

2. valuecmd, in contrast to get(), is most importantly a *mutator*, it 
will *always* perform a state change, i.e. the result of the valuecmd 
script becomes the value of the object variable. well, frankly, you 
could write a refining get() in a way that is changes the state, but 
this is up to you ;)

while there are more subtle differences (e.g., valuecmd is an [eval]'ed 
script, not a proc; the two do interact, as shown above; valuecmd does 
not now about its surrounding context, i.e. the domain object, unless 
being tricked into), this should get you started, i hope ...

//stefan


More information about the Xotcl mailing list