Executing bundle of functions by their metadata tag in Dart lang

Issue

Building on this, I want to write a code that run A:: the functions refeed by the same metadata tag.

I tunes the codes of the previous thread as below:

getFunctionMirrorsByTag.dart

library impl;
@MirrorsUsed(metaTargets: Tag)
import 'dart:mirrors';

class Tag {
  final Symbol name;
   const Tag(this.name);
 }
 List<ClassMirror> getClassMirrorsByTag(Symbol name) {
  List res = new List();
  MirrorSystem ms = currentMirrorSystem();
  ms.libraries.forEach((u, lm) {
  lm.declarations.forEach((s, dm) {
  dm.metadata.forEach((im) {
    if ((im.reflectee is Tag) && im.reflectee.name == name) {
      res.add(dm);     // I want to replace this by a statement executing the returned function
       }
     });
    });
  });
  return res;
}

main.dart:

library  main;
import 'getFunctionMirrorsByTag.dart';
import 'extra.dart';
 @Tag(#foo)
    printa()=>print('a');

 @Tag(#foo)
  printb()=>print('b');


 void main() {
    print(getClassMirrorsByTag(#foo));
 }

Using the above, the output I get is:

[MethodMirror on 'printa', MethodMirror on 'printb']

Solution

@MirrorsUsed(metaTargets: Tag)
import 'dart:mirrors';

class Tag {
  final Symbol name;
  const Tag(this.name);
}
List getMirrorsByTag(Symbol name) {
  List res = new List();
  MirrorSystem ms = currentMirrorSystem();
  ms.libraries.forEach((u, lm) {
    lm.declarations.forEach((s, dm) {
      dm.metadata.forEach((im) {
        if ((im.reflectee is Tag) && im.reflectee.name == name) {
          res.add(dm);
        }
      });
    });
  });
  return res;
}

@Tag(#foo)
printa() => print('a');

@Tag(#foo)
printb() => print('b');


void main() {
  getMirrorsByTag(#foo).forEach((MethodMirror me) {
    LibraryMirror owner = me.owner;
    owner.invoke(me.simpleName, []);
  });
}

Answered By – JAre

Answer Checked By – Dawn Plyler (FlutterFixes Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *