Generating a method using a UDA

arturg var.spool.mail700 at
Wed May 9 12:03:08 UTC 2018

On Wednesday, 9 May 2018 at 10:16:22 UTC, Melvin wrote:
> I'm trying to find a friendly syntax for defining things in a 
> framework. For context, I've been looking into finding a 
> solution for this problem 
> ( on the 
> Godot-D project. I've done some investigating already, and it 
> looks like I can only achieve what I want with a mixin, but I'd 
> like to get a second opinion.
> Say we have a class that defines a custom Signal (an event). In 
> an ideal world, the syntax would work similarly to this:
> class SomeNode : GodotScript!Node
> {
>     @Signal void testSignal(float a, long b);
>     // The declaration above would trigger the generation of 
> this line
>     void testSignal(float a, long b) { 
> owner.emitSignal("testSignal", a, b); }
>     @Method emitTest()
>     {
>         testSignal(3.1415, 42);
>     }
> }
> The reason I want to use a UDA is to stay consistent with the 
> other UDAs already defined for Properties and Methods. It also 
> looks friendlier than using a mixin. Does anyone here have any 
> thoughts as to how this could work?
> My main issue is injecting that generated method without 
> resorting to using a mixin. I was hoping that any code I needed 
> could be generated in the template that SomeNode inherits, but 
> that doesn't look possible because I can't inspect the subclass 
> (for good reason).

hi, i actually have something like that, which i should put on 

i used it to learn about D's introspection, so its more of a 
prototype and will need some more work.

it looks like this:

class Test
     mixin signalsOf!SigList;

     interface SigList
         @Signal void someFun(int);

     void someFunHandler(int){}

signalsOf takes a type/template or function list, introspects 
them then generates the actual signal functions.
the additional api is similar to qt's api.

void main()
     Test t = new Test;
     t.someFun(4); // emit the signal

you can have different connection types and i also have string 
based connection and auto connection based on a naming convetion 
like signalname: someSig and slotname: onSomeSig.

More information about the Digitalmars-d-learn mailing list