Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import 'dart:mirrors';
- class MethodExtensible {
- Map _methods = {};
- void noSuchMethod(Invocation inv) {
- String name = MirrorSystem.getName(inv.memberName);
- String fname = name.replaceAll('=','');
- if (_methods.containsKey(fname) && !name.endsWith('=')) {
- List args = new List<dynamic>.from(inv.positionalArguments);
- args.insert(0, this);
- Function.apply(_methods[fname], args, inv.namedArguments);
- } else if (name.endsWith('=') && inv.positionalArguments[0] is Function) {
- _methods[fname] = inv.positionalArguments[0];
- } else {
- throw new NoSuchMethodError(this, inv.memberName, inv.positionalArguments, inv.namedArguments);
- }
- }
- }
- class myObj extends MethodExtensible {
- String val = 'test string';
- }
- void injected_func(self, {name: 'bleamz'}) {
- print(self.val);
- print(name);
- }
- void main() {
- myObj myobj = new myObj();
- myobj.printVal = (var self) => print(self.val);
- myobj.printVal();
- myobj.printVal = (self) => print('${self.val} from new method');
- myobj.printVal();
- myobj.printVal = injected_func;
- myobj.printVal(name:'blah blah');
- myobj.fasfdasasd(); //expect NoSuchMethodError.
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement