public MemberAnnotation Annotate <T>(Expression <Proc> memberExpression, params Func <string, T>[] args)
        {
            MemberAnnotation memberAnnotation = ForMember(memberExpression);

            memberAnnotation.Annotate(args);
            return(memberAnnotation);
        }
        public static T Annotation <T>(this object target, Expression <Funclet> expression, object key)
        {
            ClassAnnotation  classAnnotation  = GetOrCreateAnnotation(target);
            MemberAnnotation memberAnnotation = classAnnotation.ForMember(expression);

            return((T)memberAnnotation[key]);
        }
        public MemberAnnotation ForMember(LambdaExpression expression)
        {
            if (expression == null)
            {
                throw new ArgumentException("expression");
            }

            MemberInfo info = GetMemberKey(expression);

            MemberAnnotation memberAnnotation;

            if (!_memberAnnotations.TryGetValue(info, out memberAnnotation))
            {
                lock (_memberAnnotations)
                {
                    if (!_memberAnnotations.TryGetValue(info, out memberAnnotation))
                    {
                        memberAnnotation = new MemberAnnotation(info, this);

                        _memberAnnotations[info] = memberAnnotation;
                    }
                }
            }

            return(memberAnnotation);
        }