/**
 * Support for classes.
 */
module dryad/lib-ext/oo/classes
imports
  dryad/lib-ext/hash-table
  
signature
  constructors
    Instance : Class * Id -> Instance
    Class    : ClassName  -> Class

strategies

  /**
   * Creates a new class instance
   */
  classes_new-instance =
    !Instance(<?Class(_)>, <new> ())

  classes_instanceof(|name) =
    ?Instance(Class(name), _)

  /**
   * Gets the class for a given name.
   */
  classes_get-class =
    !Class(<id>)

  classes_get-fieldtbl =
    table-hashtable
    ; hashtable-get(new-hashtable |"fields")

strategies

  classes_get-instance-field(|name) =
    ?Instance(_, x)
    ; classes_get-fieldtbl
    ; hashtable-get(|(x, name))

  classes_get-instance-field(ifnot | name) =
    ?this@Instance(_, x)
    ; classes_get-fieldtbl
    ; hashtable-get(<ifnot> this |(x, name))

  classes_set-instance-field(|name, value) =
    ?Instance(_, x)
    ; where(
        classes_get-fieldtbl
        ; hashtable-put(|(x, name), value)
      )

  classes_get-class-field(|name) =
    ?Instance(_, Class(x))
    ; classes_get-fieldtbl
    ; hashtable-get(|x)