public function inferType($value) {
    if (is_string($value)) {
      return new StringType();
    } elseif (is_array($value)) {
      return new ArrayType();
    } elseif (is_object($value)) {
      return $this->inferObjectType($value);
    } elseif (is_integer($value)) {
      return new IntegerType();
    } elseif (is_bool($value)) {
      return new BooleanType();
    } elseif(is_null($value)) {
      return new MixedType();
    }

    $e = new InferException('Typ konnte nicht geraten werden: '.Util::varInfo($value));
    $e->value = $value;
    throw $e;
  }