using System;
using PostSharp.Samples.CustomLogging.Aspects;
 
// Add logging to every method in the assembly.
 
[assembly: LogMethod(AttributePriority = 0)]
 
// Remove logging from the Aspects namespace to avoid infinite recursions (logging would log itself).
 
[assembly:
  LogMethod(AttributePriority = 1, AttributeExclude = true,
    AttributeTargetTypes = "PostSharp.Samples.CustomLogging.Aspects.*")]
 
// Add logging to System.Math to show we can add logging to anything.
 
[assembly:
  LogMethod(AttributePriority = 2, AttributeTargetAssemblies = "mscorlib", 
    AttributeTargetTypes = "System.Math")]
 
namespace PostSharp.Samples.CustomLogging
{
  internal static class Program
  {
    [LogSetValue] private static int Value;
 
    private static void Main()
    {
      // Demonstrate that we can create a nice hierarchical log including parameter and return values.
      Value = Fibonacci(5);
 
      // Demonstrate how exceptions are logged.
      try
      {
        Fibonacci(-1);
      }
      catch
      {
      }
 
      // Demonstrate that we can add logging to system methods, too.
      Console.WriteLine(Math.Sin(5));
    }
 
 
    private static int Fibonacci(int n)
    {
      if (n < 0)
        throw new ArgumentOutOfRangeException();
      if (n == 0)
        return 0;
      if (n == 1)
        return 1;
 
      return Fibonacci(n - 1) + Fibonacci(n - 2);
    }
  }
}