public Attribute CreateProxyInstance()
        {
            var interfaces = AnnotationClass
                .GetInterfaces()
                .ToArray();

            return (Attribute) Generator.CreateClassProxy(
                AnnotationClass, interfaces, ProxyGenerationOptions.Default, this);
        }
        private object HandleHashCode()
        {
            if (hashCode != null) {
                return hashCode;
            }

            var result = AnnotationClass.GetHashCode();
            foreach (var key in Attributes.Keys) {
                result = 31 * result + key.GetHashCode();
            }

            hashCode = result;
            return hashCode;
        }
        private string HandleToString()
        {
            if (toStringResult == null) {
                var buf = new StringBuilder();
                buf.Append("@");
                buf.Append(AnnotationClass.GetSimpleName());
                if (!Attributes.IsEmpty()) {
                    var delimiter = "";
                    buf.Append("(");

                    if (Attributes.Count == 1 && Attributes.ContainsKey("Value")) {
                        if (Attributes.Get("Value") is string) {
                            buf.Append("\"");
                            buf.Append(Attributes.Get("Value"));
                            buf.Append("\"");
                        }
                        else {
                            buf.Append(Attributes.Get("Value"));
                        }
                    }
                    else {
                        foreach (var attribute in Attributes) {
                            buf.Append(delimiter);
                            buf.Append(attribute.Key);
                            buf.Append("=");
                            if (attribute.Value is string) {
                                buf.Append("\"");
                                buf.Append(attribute.Value);
                                buf.Append("\"");
                            }
                            else {
                                buf.Append(attribute.Value);
                            }

                            delimiter = ", ";
                        }
                    }

                    buf.Append(")");
                }

                toStringResult = buf.ToString();
            }

            return toStringResult;
        }