/**
  * Unmarshall a QTI mathOperator operator element into a MathsOperator object.
  *
  * @param DOMElement The mathOperator element to unmarshall.
  * @param QtiComponentCollection A collection containing the child Expression objects composing the Operator.
  * @return QtiComponent A MathOperator object.
  * @throws UnmarshallingException
  */
 protected function unmarshallChildrenKnown(DOMElement $element, QtiComponentCollection $children)
 {
     if (($name = static::getDOMElementAttributeAs($element, 'name')) !== null) {
         $object = new MathOperator($children, MathFunctions::getConstantByName($name));
         return $object;
     } else {
         $msg = "The mandatory attribute 'name' is missing from element '" . $element->localName . "'.";
         throw new UnmarshallingException($msg, $element);
     }
 }
 /**
  * Set the name of the math function to use.
  * 
  * @param integer $name A value from the MathFunctions enumeration.
  * @throws InvalidArgumentException If $name is not a value from the MathFunctions enumeration.
  */
 public function setName($name)
 {
     if (in_array($name, MathFunctions::asArray())) {
         $this->name = $name;
     } else {
         $msg = "The name attribute must be a value from the MathFunctions enumeration, '" . $name . "' given.";
         throw new InvalidArgumentException($msg);
     }
 }
    public function createFakeExpression($constant)
    {
        return $this->createComponentFromXml('
			<mathOperator name="' . MathFunctions::getNameByConstant($constant) . '">
				<baseValue baseType="float">1.5708</baseValue>
			</mathOperator>
		');
    }
 /**
  * Process the MathOperator operator.
  * 
  * @return float|integer|null The result of the MathOperator call or NULL if any of the sub-expressions is NULL. See the class documentation for special cases.
  */
 public function process()
 {
     $operands = $this->getOperands();
     if ($operands->containsNull() === true) {
         return null;
     }
     if ($operands->exclusivelySingle() === false) {
         $msg = "The MathOperator operator only accepts operands with a single cardinality.";
         throw new OperatorProcessingException($msg, $this, OperatorProcessingException::WRONG_CARDINALITY);
     }
     if ($operands->exclusivelyNumeric() === false) {
         $msg = "The MathOperator operator only accepts operands with an integer or float baseType.";
         throw new OperatorProcessingException($msg, $this, OperatorProcessingException::WRONG_BASETYPE);
     }
     $qtiFuncName = MathFunctions::getNameByConstant($this->getExpression()->getName());
     $methodName = 'process' . ucfirst($qtiFuncName);
     $result = call_user_func_array(array($this, $methodName), array());
     if ($result instanceof Float && is_nan($result->getValue()) === true) {
         // outside the domain of the function.
         return null;
     } else {
         return $result;
     }
 }