 <p>This example also may help you to understand:</p> <pre class="lang-dart prettyprint-override"><code>void main() { var car = new CarProxy(new ProxyObjectImpl('Car')); testCar(car); var person = new PersonProxy(new ProxyObjectImpl('Person')); testPerson(person); } void testCar(Car car) { print(car.motor); } void testPerson(Person person) { print(person.age); print(person.name); } abstract class Car { String get motor; } abstract class Person { int get age; String get name; } class CarProxy implements Car { final ProxyObject _proxy; CarProxy(this._proxy); noSuchMethod(Invocation invocation) { return _proxy.handle(invocation); } } class PersonProxy implements Person { final ProxyObject _proxy; PersonProxy(this._proxy); noSuchMethod(Invocation invocation) { return _proxy.handle(invocation); } } abstract class ProxyObject { dynamic handle(Invocation invocation); } class ProxyObjectImpl implements ProxyObject { String type; int id; Map&lt;Symbol, dynamic&gt; properties; ProxyObjectImpl(this.type, [this.id]) { properties = ProxyManager.getProperties(type); } dynamic handle(Invocation invocation) { var memberName = invocation.memberName; if(invocation.isGetter) { if(properties.containsKey(memberName)) { return properties[memberName]; } } throw "Runtime Error: $type has no $memberName member"; } } class ProxyManager { static Map&lt;Symbol, dynamic&gt; getProperties(String name) { Map&lt;Symbol, dynamic&gt; properties = new Map&lt;Symbol, dynamic&gt;(); switch(name) { case 'Car': properties[new Symbol('motor')] = 'xPowerDrive2013'; break; case 'Person': properties[new Symbol('age')] = 42; properties[new Symbol('name')] = 'Bobby'; break; default: throw new StateError('Entity not found: $name'); } return properties; } } </code></pre>