module php/reflect/common/class
imports
  php/reflect/oo/classes

strategies
  /**
   * Succeeds if the current term is an instance of PHP class
   * Since this is an abstract class there are no instances
   */
  instanceof-PHPClass =
    fail

/**
 * Properties
 */
strategies

  /**
   * Returns the name of the class
   *
   * @type Class Object -> String
   */
  get-name(s) = instanceof-PHPClass;
      get-reference-ast
    ; s
    
  get-class-name =
      ?Class(_, <id>, _, _)

  /**
   * Returns the name of the class
   * it extends (if any)
   *
   * @type Class Object -> String
   */
  get-extends(s) = instanceof-PHPClass;
      get-reference-ast
    ; s
    
  get-extends-name =
      ?Class(_, _, Some(Extends(<id>)), _)

  /**
   * Returns the instance-variables of this class
   *
   * @type Class Object -> List(InstanceVariable)
   */
  get-instance-variables(s) = instanceof-PHPClass;
      get-reference-ast
    ; collect-all(s)

  match-instance-variable =
    ?InstanceVariable(_)


strategies
  /**
   * Returns all functions.
   *
   * @type Class Object -> List(Function Object)
   */
  get-functions = instanceof-PHPClass;
    classes_get-instance-field(|"function-table")
    ; hashtable-values

  /**
   * @param Name of the function (String)
   * @type  Class Object -> Class Object
   */
  get-function(|name) = instanceof-PHPClass;
    classes_get-instance-field(|"function-table")
    ; hashtable-get(|name)

  /**
   * @param Function Object
   * @type Class Object -> Class Object
   */
  add-function(|function) = instanceof-PHPClass;
    where(
      classes_get-instance-field(|"function-table")
      ; where(name := <get-name> function)
      ; hashtable-put(|name, function)
    )

strategies
   /**
    * Returns the parent of a class object (if any)
    *
    * @type Class Object -> Class Object
    */
    get-class-parent = instanceof-PHPClass; ?class;
       extends := <get-extends> class
     ; env     := <get-php-environment>
     ; <get-class(|extends)> env


/**
 * AST representation
 */
strategies

  /** 
   * Returns the AST of the function.
   *
   * @type Function Object -> AST
   */
  get-ast = instanceof-PHPClass;
    get-reference-ast
    
  get-reference-ast = instanceof-PHPClass;
    classes_get-instance-field(|"reference-ast")

  set-reference-ast(|refast) = instanceof-PHPClass;
    classes_set-instance-field(|"reference-ast", refast)