You can override noSuchMethod
(emulating functions)
@proxy
class QueryMap {
Map _data = new Map();
QueryMap();
noSuchMethod(Invocation invocation) {
if (invocation.isGetter) {
var ret = _data[invocation.memberName.toString()];
if (ret != null) {
return ret;
} else {
super.noSuchMethod(invocation);
}
}
if (invocation.isSetter) {
_data[invocation.memberName.toString().replaceAll('=', '')] =
invocation.positionalArguments.first;
} else {
super.noSuchMethod(invocation);
}
}
}
void main() {
QueryMap qaueryMap = new QueryMap();
qaueryMap.greet = "Hello Dart!";
print(qaueryMap.greet); //Hello Dart!
}
As noted by @PixelElephant with external map you have to use real method names as map keys:
import 'dart:mirrors';
@proxy
class QueryMap {
Map _data;
QueryMap(this._data);
noSuchMethod(Invocation invocation) {
if (invocation.isGetter) {
var ret = _data[MirrorSystem.getName(invocation.memberName)];
if (ret != null) {
return ret;
} else {
super.noSuchMethod(invocation);
}
}
if (invocation.isSetter) {
_data[MirrorSystem.getName(invocation.memberName).replaceAll('=', '')] =
invocation.positionalArguments.first;
} else {
super.noSuchMethod(invocation);
}
}
}
void main() {
Map myMap = new Map();
myMap["color"] = "red";
QueryMap qaueryMap = new QueryMap(myMap);
qaueryMap.greet = "Hello Dart!";
print(qaueryMap.greet); //Hello Dart!
print(qaueryMap.color); //red
}
To avoid usage of mirrors, you can go with pattern matching on symbol's string serialization or transforming external map keys:
@proxy
class QueryMap {
Map _data;
QueryMap(Map data) {
_data = new Map();
data.forEach((k, v) => _data[new Symbol(k).toString()] = v);
}
noSuchMethod(Invocation invocation) {
if (invocation.isGetter) {
var ret = _data[invocation.memberName.toString()];
if (ret != null) {
return ret;
} else {
super.noSuchMethod(invocation);
}
}
if (invocation.isSetter) {
_data[invocation.memberName.toString().replaceAll('=', '')] =
invocation.positionalArguments.first;
} else {
super.noSuchMethod(invocation);
}
}
}
void main() {
Map myMap = new Map();
myMap["color"] = "red";
QueryMap qaueryMap = new QueryMap(myMap);
qaueryMap.greet = "Hello Dart!";
print(qaueryMap.greet); //Hello Dart!
print(qaueryMap.color); //red
}