anchor.diff:  ${myBean.doSomething(myVar, execution)}
   ----
   
  -Note that these expressions support resolving primitives (incl. comparing them), beans, lists, arrays and maps.
  -
  -On top of all process variables, there are a few default objects available to be used in expressions:
  -
  -* ++execution++: The +DelegateExecution+ that holds additional information about the ongoing execution.
  -* ++task++: The +DelegateTask+ that holds additional information about the current Task. *Note: Only works in expressions evaluated from task listeners.*
  +Note that these expressions support resolving primitives (including comparing them), beans, lists, arrays and maps.
  +
  +On top of all process variables, there are a few default objects available that can be used in expressions:
  +
  +* ++execution++: The +DelegateExecution+ holds additional information about the ongoing execution.
  +* ++task++: The +DelegateTask+ holds additional information about the current Task. *Note: Only works in expressions evaluated from task listeners.*
   * ++authenticatedUserId++: The id of the user that is currently authenticated. If no user is authenticated, the variable is not available.
   
   For more concrete usage and examples, check out <<springExpressions,Expressions in Spring>>, <<bpmnJavaServiceTaskXML,Java Service tasks>>, <<executionListeners,Execution Listeners>>,  <<taskListeners,Task Listeners>> or <<conditionalSequenceFlowXml,Conditional sequence flows>>.
  
positive.code: <T> T getVariable(String executionId, String variableName, Class<T> variableClass);
  ----
  
  Variables are often used in <<bpmnJavaServiceTask, Java delegates>>, <<apiExpressions, expressions>>, execution- or tasklisteners, scripts, etc. In those constructs, the current _execution_ or _task_ object is available and it can be used for variable setting and/or retrieval. The simplest methods are these:
  
  [source,java,linenums]
  ----
  
negative.code: 
  In the example above, when an id is passed for which no task exists, an exception will be thrown. Also, since the javadoc *explicitly states that taskId cannot be null, an +FlowableIllegalArgumentException+ will be thrown when +null+ is passed*.
  
  Even though we want to avoid a big exception hierarchy, the following subclasses are thrown in specific cases. All other errors that occur during process-execution or API-invocation that don't fit into the possible exceptions below, are thrown as regular ++FlowableExceptions++s.
  
  * ++FlowableWrongDbException++: Thrown when the Flowable engine discovers a mismatch between the database schema version and the engine version.
  * ++FlowableOptimisticLockingException++: Thrown when an optimistic locking occurs in the data store caused by concurrent access of the same data entry.
  * ++FlowableClassLoadingException++: Thrown when a class requested to load was not found or when an error occurred while loading it (e.g. JavaDelegates, TaskListeners, ...).
  * ++FlowableObjectNotFoundException++: Thrown when an object that is requested or actioned does not exist.
  * ++FlowableIllegalArgumentException++: An exception indicating that an illegal argument has been supplied in a Flowable API-call, an illegal value was configured in the engine's configuration or an illegal value has been supplied or an illegal value is used in a process-definition.
  * ++FlowableTaskAlreadyClaimedException++: Thrown when a task is already claimed, when the +taskService.claim(...)+ is called.
  
  