private static void SetupMethod(Type baseType, IMethodBuilder method, IPropertyBuilder aspectusStarting, IPropertyBuilder aspectusEnding, IPropertyBuilder aspectusException, MethodInfo baseMethod) { if (baseMethod == null) { baseMethod = baseType.GetMethod(method.Name); } method.SetCurrentMethod(); Label endLabel = method.Generator.DefineLabel(); VariableBase returnValue = method.ReturnType != typeof(void) ? method.CreateLocal("FinalReturnValue", method.ReturnType) : null; Try Try = method.Try(); { SetupStart(method, endLabel, returnValue, aspectusStarting); _aspects.ForEach(x => x.SetupStartMethod(method, baseType)); var parameters = new List <ParameterBuilder>(); method.Parameters.For(1, method.Parameters.Count - 1, x => parameters.Add(x)); if (method.ReturnType != typeof(void) && baseMethod != null) { returnValue.Assign(method.This.Call(baseMethod, parameters.ToArray())); } else if (baseMethod != null) { method.This.Call(baseMethod, parameters.ToArray()); } SetupEnd(method, returnValue, aspectusEnding); _aspects.ForEach(x => x.SetupEndMethod(method, baseType, returnValue)); method.Generator.MarkLabel(endLabel); } Catch Catch = Try.StartCatchBlock(typeof(System.Exception)); { SetupException(method, Catch, aspectusException); _aspects.ForEach(x => x.SetupExceptionMethod(method, baseType)); Catch.Rethrow(); } Try.EndTryBlock(); if (method.ReturnType != typeof(void)) { method.Return(returnValue); } else { method.Return(); } }