From jon.clayden at gmail.com  Sat Oct 23 01:52:02 2010
From: jon.clayden at gmail.com (Jon Clayden)
Date: Sat, 23 Oct 2010 00:52:02 +0100
Subject: [Rd] Reference classes
In-Reply-To: <4CC1CFFE.5080402@r-project.org>
References: <AANLkTik+o=SgwXO5augahHC18Hv9hBL87VOyGVG8LqN_@mail.gmail.com>
	<4CC1CFFE.5080402@r-project.org>
Message-ID: <AANLkTinrSDJ6ZxinQNF3F9EVnnU=x0VeaxYoq6+t41fe@mail.gmail.com>

On 22 October 2010 18:55, John Chambers <jmc at r-project.org> wrote:

>> As a suggestion, it would be nice if the accessors() method could be
>> used to create just "getters" or just "setters" for particular fields,
>> although I realise this can be worked around by removing the unwanted
>> methods afterwards.
>
> In other words, read-only fields. ?There is a facility for that implemented
> already, but it didn't yet make it into the documentation, and it could use
> some more testing. ?The generator object has a $lock() method that inserts a
> write-once type of method for one or more fields. ?Example:
>
>> fg <- setRefClass("foo", list(bar = "numeric", flag = "character"),
> + ? ? ? ? ? ? methods = list(
> + ? ? ? ? ? ? addToBar = function(incr) {
> + ? ? ? ? ? ? ? ? b = bar + incr
> + ? ? ? ? ? ? ? ? bar <<- b
> + ? ? ? ? ? ? ? ? b
> + ? ? ? ? ? ? }
> + ? ? ? ? ? ? ))
>> fg$lock("bar")
>> ff = new("foo", bar = 1.5)
>> ff$bar <- 2
> Error in function (value) ?: Field "bar" is read-only
>
> A revision will document this soon.
>
> (And no, the workaround is not to remove methods. ?To customize access to a
> field, the technique is to write an accessor function for the field that, in
> this case, throws an error if it gets an argument. ?See the documentation
> for the fields argument. ?The convention here and the underlying mechanism
> are taken from active bindings for environments.)

OK, yes - I see. This is clearly much less superficial than removing
the setter method for a field which can be directly set anyway. I'll
have to try out field accessor functions and get a feel for the
semantics.

Many thanks for the rapid and very helpful response.

Regards,
Jon



[Rd] Reference classes
Jon Clayden