[Question] About mixin, template and alias

Michael pr at m1xa.com
Mon Sep 23 12:47:30 PDT 2013


Code below shows that I would achieve:

///// fire.d
alias void delegate() EventHandler;

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

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

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

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

mixin template AddEvent(DelegateType, string member)
{
     private Event!DelegateType _eventObserver;

     @property auto get()
     {
         if (_eventObserver is null)
             _eventObserver = new Event!DelegateType();

         return _eventObserver;
     }

     void doEventObserver(ParamType ...)(ParamType params)
     {
         mixin (member ~ "()(params);");
     }

     mixin ("alias get " ~ member ~ ";");
     mixin ("alias doEventObserver do" ~ member ~ ";");
}

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

class DoubleFire
{
     private Event!EventHandler _click;


     public this()
     {
         _click = new Event!EventHandler();
     }

     @property public Event!EventHandler click()
     {
         return _click;
     }

     public void doClick(ParamType ...)(ParamType params)
     {
         click()(params);
     }
}


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

import fire;

class Water : Fire
{

}

void main()
{
     Fire element;

     element = new Fire();
     element.click  ~= () { writeln("Fire!");  };
     element.click()(); // Not needed with DIP 23

     element = new Water();
     element.click ~= () { writeln("Water!"); };
     element.click()(); // Not needed with DIP 23

     DoubleFire df = new DoubleFire();
     df.click ~= () { writeln("Double Fire!"); };
     df.doClick(); // Workaround

     element.doclick(); // Workaround
}

///// Output

Fire!
Water!
Double Fire!
Water!


Thanks)


More information about the Digitalmars-d-learn mailing list