using PostSharp.Aspects;
using PostSharp.Serialization;
using System.Text;

namespace PostSharp.Samples.CustomLogging.Aspects
{
  /// <summary>
  ///   Aspect that, when applied to a field or property, appends a record to the <see cref="Logger" /> class whenever this
  ///   field or property is set to a new value.
  /// </summary>
  [PSerializable]
  public sealed class LogSetValueAttribute : LocationInterceptionAspect
  {
    public override void OnSetValue(LocationInterceptionArgs args)
    {
      var stringBuilder = new StringBuilder();
      stringBuilder.Append("Setting ");
      Formatter.AppendTypeName(stringBuilder, args.Location.DeclaringType);
      if (args.Index.Count != 0)
      {
        Formatter.AppendArguments(stringBuilder, args.Index);
      }
 
      stringBuilder.Append(" = ");
      stringBuilder.Append(args.Value);

      Logger.WriteLine(stringBuilder.ToString());

      base.OnSetValue(args);
    }
  }
}