/** * Support for classes. */ module php/reflect/oo/classes signature constructors Instance : Class * Id -> Instance Class : ClassName -> Class strategies /** * Creates a new class instance * * -> Class */ classes_new-instance = !Instance(<?Class(_)>, <new> ()) /** * Returns true of the class is an instance of * the desired name. * * @type Class -> Bool **/ classes_instanceof(|name) = ?Instance(Class(name), _) /** * Gets the class for a given name. * * @type Name -> Class */ classes_get-class = !Class(<id>) /** * Returns the field table of the class. * * @type _ -> HashTable */ 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) strategies hashtable-get(ifnot | key) = hashtable-get(|key) <+ where(ifnot => value) ; hashtable-put(|key, value) ; !value /** * Avoid the choice operator in hashtable push if we know that the key exists. * Also, fails if the key does not exist. */ hashtable-push-existing(|key, value) = where(hashtable-get(|key) => previous) ; hashtable-put(|key, [value | previous])