/////// fire.d

import std.stdio;

alias void delegate() EventHandler;

class Event(T)
{
    private T[] _events;

    public void opOpAssign(string op)(T param) if (op == "~")
    {
        writeln(param.funcptr);
        _events ~= param;
    }

    public void opCall(ParamType ...)(ParamType params)
    {
        emit(params);
    }

    protected void emit(ParamType ...)(ParamType params)
    {
        foreach (event; _events)
            event(params);
    }
}

mixin template AddEvent(DelegateType, string member)
{
    auto eventObserver =  new Event!DelegateType();

    mixin("alias eventObserver " ~ member ~ ";");
}

class Fire
{
    public mixin AddEvent!(EventHandler, "click");
}

/////// water.d
import std.stdio;

import fire;

class Water : Fire
{

}

void main()
{
    auto fire  = new Fire();
    auto water = new Water();
    water.click ~= () { writeln("Water!"); };
    fire.click  ~= () { writeln("Fire!");  };

    fire.click();
}


Output:
Water!
Fire!

Someone can explain me a behaviour of above code? Why not "Fire!" only?

Reply via email to