@Override
    public Result execute(Scope scope) throws Exception {
      Value value = evaluation.evaluate(scope, null);
      Object object = value.getValue();

      if (!Boolean.TRUE.equals(object)) {
        throw new AssertionException("Assertion failed");
      }
      return ResultType.getNormal();
    }
  @Override
  public Result compile(Scope outer) throws Exception {
    if (!compile.compareAndSet(false, true)) {
      Result result = builder.compile(outer);
      Type type = result.getValue();

      collector.update(constants); // collect static constants first

      for (TypePart part : parts) {
        Initializer initializer = part.compile(collector, type);
        collector.update(initializer);
      }
      generator.generate(type);

      return result;
    }
    return ResultType.getNormal();
  }