/*
 * C# Program to Demonstrate Trigger Concept
 */
using System;
delegate bool Condition(object obj);
delegate void Action(object obj);
class Counter
{
    int val = 0;

    public event Condition cond;
    public event Action evn;

    public int Value { get { return val; } }

    public void addition(int x)
    {
        val += x;
        Checkpoint();
    }

    public void Clearall()
    {
        val = 0;
        Checkpoint();
    }

    void Checkpoint()
    {
        if (cond != null && evn != null && cond(this)) evn(this);
    }
}
class Test
{
    static int hval = 0;
    static bool CheckpointLimit(object ctr)
    {
        return (((Counter)ctr).Value > 100);
    }
    static void Alarm(object ctr)
    {
        Console.WriteLine("Counter Overflow");
    }
    static void Reset(object ctr)
    {
        hval = ((Counter)ctr).Value;
        Console.WriteLine("hval = " + hval);
        ((Counter)ctr).Clearall();
    }
    public static void Main()
    {
        Counter counter = new Counter();
        counter.cond += new Condition(CheckpointLimit);
        counter.evn += new Action(Alarm);
        counter.evn += new Action(Reset);
        counter.addition(10);
        counter.addition(20);
        counter.addition(30);
        counter.addition(40);
        counter.addition(50);
        Console.Read();
    }
}