docs: public RuleConditionElement build(final RuleBuildContext context,
                                        final BaseDescr descr,
                                        final Pattern prefixPattern) {
          boolean typesafe = context.isTypesafe();
          // it must be an EvalDescr
          final EvalDescr evalDescr = (EvalDescr) descr;
  
          try {
              MVELDialect dialect = (MVELDialect) context.getDialect( "mvel" );
  
              Map<String, Declaration> decls = context.getDeclarationResolver().getDeclarations(context.getRule());
              
              AnalysisResult analysis = context.getDialect().analyzeExpression( context,
                                                                                evalDescr,
                                                                                evalDescr.getContent(),
                                                                                new BoundIdentifiers( DeclarationScopeResolver.getDeclarationClasses( decls ),
                                                                                                      context ) );
  
              final BoundIdentifiers usedIdentifiers = analysis.getBoundIdentifiers();
              int i = usedIdentifiers.getDeclrClasses().keySet().size();
              Declaration[] previousDeclarations = new Declaration[i];
              i = 0;
              for ( String id :  usedIdentifiers.getDeclrClasses().keySet() ) {
                  previousDeclarations[i++] = decls.get( id );
              }
              Arrays.sort( previousDeclarations, SortDeclarations.instance  ); 
              
              MVELCompilationUnit unit = dialect.getMVELCompilationUnit( (String) evalDescr.getContent(),
                                                                         analysis,
                                                                         previousDeclarations,
                                                                         null,
                                                                         null,
                                                                         context,
                                                                         "drools",
                                                                         KnowledgeHelper.class,
                                                                         false,
                                                                         MVELCompilationUnit.Scope.EXPRESSION );
              final EvalCondition eval = new EvalCondition( previousDeclarations );
  
              MVELEvalExpression expr = new MVELEvalExpression( unit,
                                                                dialect.getId() );
              eval.setEvalExpression( KiePolicyHelper.isPolicyEnabled() ? new SafeEvalExpression(expr) : expr );
  
              MVELDialectRuntimeData data = (MVELDialectRuntimeData) context.getPkg().getDialectRuntimeRegistry().getDialectData( "mvel" );
              data.addCompileable( eval,
                                    expr );
  
              expr.compile( data, context.getRule() );
              return eval;
          } catch ( final Exception e ) {
              copyErrorLocation(e, evalDescr);
              context.addError( new DescrBuildError( context.getParentDescr(),
                                                            evalDescr,
                                                            e,
                                                            "Unable to build expression for 'eval':" + e.getMessage() + " '" + evalDescr.getContent() + "'" ) );
              return null;
          } finally {
              context.setTypesafe( typesafe );
          }
      }