using System;

public class Program
{
    public static void Main()
    {
        IFoo<int> test1 = new Foo<int>();
        test1.ChangeEmpty  += ()  => Console.WriteLine("0) Empty!");
        test1.ChangeObject += (o) => Console.WriteLine("1) Object: {0}", o);
        test1.ChangeValue  += (v) => Console.WriteLine("2) Value:  {0}", v);
        test1.ChangeObject += (o) => Console.WriteLine("3) Object: {0}", o);
        test1.ChangeEmpty  += ()  => Console.WriteLine("4) Empty!");
        test1.InvokeChange(123);
        
        Console.WriteLine("\n--------\n");
        
        IFoo<int> test2 = new Foo<int>();

        test2.ChangeEmpty += EmptyHandler;
        test2.ChangeObject += ObjectHandler;
        Console.WriteLine("1) EMPTY, OBJECT");
        test2.InvokeChange(1);

        test2.ChangeEmpty -= EmptyHandler;
        test2.ChangeValue += ValueHandler;
        Console.WriteLine("2) OBJECT, VALUE");
        test2.InvokeChange(2);

        test2.ChangeObject -= ObjectHandler;
        Console.WriteLine("3) VALUE ");
        test2.InvokeChange(3);

        test2.ChangeObject += ObjectHandler;
        test2.ChangeEmpty += EmptyHandler;
        test2.ChangeValue += ValueHandler;
        Console.WriteLine("4) VALUE, OBJECT, EMPTY, VALUE");
        test2.InvokeChange(4);

        test2.ChangeValue -= ValueHandler;
        test2.ChangeValue -= ValueHandler;
        test2.ChangeEmpty -= EmptyHandler;
        test2.ChangeObject -= ObjectHandler;
        Console.WriteLine("5) <NONE>");
        test2.InvokeChange(5);
    }

    static void EmptyHandler() { Console.WriteLine("  - Empty!"); }
    static void ObjectHandler(object val) { Console.WriteLine("  - Object: {0}", val); }
    static void ValueHandler(int val) { Console.WriteLine("  - Value: {0}", val); }
}