//
// Copyright (c) 2006, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 6 Jan 06 Brian Frank Creation
//
**
** Field is a slot which models the ability to get and set a value.
**
const class Field : Slot
{
//////////////////////////////////////////////////////////////////////////
// Construction
//////////////////////////////////////////////////////////////////////////
**
** Construct a function which sets zero or more fields on a target
** object. The function can be passed to a constructor which
** takes an it-block to reflectively set const fields. Example:
**
** const class Foo
** {
** new make(|This|? f := null) { f?.call(this) }
** const Int x
** }
**
** f := Field.makeSetFunc([Foo#x: 7])
** Foo foo := Foo#.make([f])
**
static |Obj| makeSetFunc(Field:Obj? vals)
**
** Private constructor.
**
private new privateMake()
//////////////////////////////////////////////////////////////////////////
// Identity
//////////////////////////////////////////////////////////////////////////
**
** Type stored by the field.
**
Type type()
//////////////////////////////////////////////////////////////////////////
// Reflection
//////////////////////////////////////////////////////////////////////////
**
** Get the field for the specified instance. If the field is
** static, then the instance parameter is ignored. If the getter
** is non-null, then it is used to get the field.
**
virtual Obj? get(Obj? instance := null)
**
** Set the field for the specified instance. If the field is
** static, then the instance parameter is ignored. If the setter
** is non-null, then it is used to set the field.
**
virtual Void set(Obj? instance, Obj? value)
}