ObjC

+ (id)insteadBlock:(SEL)selector {
    return ^(id<AspectInfo> aspectInfo) {
        [self logBeforeInvoke:aspectInfo ofSelector:selector];
        NSDate *start = [NSDate date];
        id result = [self invoke:aspectInfo.originalInvocation];
        NSTimeInterval milliInterval = [self intervalInMilliSecond:start];
        [self logAfterInvoke:aspectInfo ofSelector:selector withResult:result withInterval:milliInterval];
    };
}