public Completion Execute(ExecutionEnvironment environment) { ExecutionEnterEventArgs args = new ExecutionEnterEventArgs(this); environment.FireEnterNode(args); try { var c = this.ExecuteImpl(environment); environment.FireLeaveNode(new ExecutionLeaveEventArgs(this, c)); return(c); } catch (Exception e) { environment.FireLeaveNode(new ExecutionLeaveEventArgs(this, Completion.Exception(e.Message, this))); return(Completion.Exception(e.Message, this)); } }