| Index: mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl | 
| diff --git a/mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl | 
| index ea235b9c7335374a6215a2a26cee22386c8b6f15..d1713fd5159cd7be49bb68ffa8863ee593eb80f1 100644 | 
| --- a/mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl | 
| +++ b/mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl | 
| @@ -63,24 +63,22 @@ abstract class {{interface|name}} { | 
| } | 
|  | 
|  | 
| -class _{{interface|name}}ProxyImpl extends bindings.Proxy { | 
| -  _{{interface|name}}ProxyImpl.fromEndpoint( | 
| +class _{{interface|name}}ProxyControl extends bindings.ProxyMessageHandler | 
| +                                      implements bindings.ProxyControl { | 
| +  _{{interface|name}}ProxyControl.fromEndpoint( | 
| core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint); | 
|  | 
| -  _{{interface|name}}ProxyImpl.fromHandle(core.MojoHandle handle) : | 
| -      super.fromHandle(handle); | 
| +  _{{interface|name}}ProxyControl.fromHandle( | 
| +      core.MojoHandle handle) : super.fromHandle(handle); | 
|  | 
| -  _{{interface|name}}ProxyImpl.unbound() : super.unbound(); | 
| - | 
| -  static _{{interface|name}}ProxyImpl newFromEndpoint( | 
| -      core.MojoMessagePipeEndpoint endpoint) { | 
| -    assert(endpoint.setDescription("For _{{interface|name}}ProxyImpl")); | 
| -    return new _{{interface|name}}ProxyImpl.fromEndpoint(endpoint); | 
| -  } | 
| +  _{{interface|name}}ProxyControl.unbound() : super.unbound(); | 
|  | 
| {{descpkg}}ServiceDescription get serviceDescription => | 
| -    new _{{interface|name}}ServiceDescription(); | 
| +      new _{{interface|name}}ServiceDescription(); | 
|  | 
| +  String get serviceName => {{interface|name}}.serviceName; | 
| + | 
| +  @override | 
| void handleResponse(bindings.ServiceMessage message) { | 
| switch (message.header.type) { | 
| {%- for method in interface.methods %} | 
| @@ -115,84 +113,30 @@ class _{{interface|name}}ProxyImpl extends bindings.Proxy { | 
| } | 
| } | 
|  | 
| +  @override | 
| String toString() { | 
| var superString = super.toString(); | 
| -    return "_{{interface|name}}ProxyImpl($superString)"; | 
| +    return "_{{interface|name}}ProxyControl($superString)"; | 
| } | 
| } | 
|  | 
|  | 
| -class _{{interface|name}}ProxyCalls implements {{interface|name}} { | 
| -  {%- if interface.methods %} | 
| -  _{{interface|name}}ProxyImpl _proxyImpl; | 
| - | 
| -  _{{interface|name}}ProxyCalls(this._proxyImpl); | 
| -  {%- else %} | 
| -  _{{interface|name}}ProxyCalls(_{{interface|name}}ProxyImpl _); | 
| -  {%- endif %} | 
| - | 
| -  {%- for method in interface.methods %} | 
| -  {%- if method.response_parameters == None %} | 
| -    void {{method|name}}( | 
| -  {%- for parameter in method.parameters -%} | 
| -      {{parameter.kind|dart_type}} {{parameter|name}}{% if not loop.last %}, {% endif %} | 
| -  {%- endfor -%} | 
| -  {%- set request_struct = method.param_struct -%} | 
| -    ) { | 
| -      if (!_proxyImpl.isBound) { | 
| -        _proxyImpl.proxyError("The Proxy is closed."); | 
| -        return; | 
| -      } | 
| -      var params = new {{request_struct|name}}(); | 
| -  {%- for parameter in method.parameters %} | 
| -      params.{{parameter|name}} = {{parameter|name}}; | 
| -  {%- endfor %} | 
| -      _proxyImpl.sendMessage(params, _{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name); | 
| -    } | 
| -  {%- else %} | 
| -  {%- set request_struct = method.param_struct %} | 
| -    dynamic {{method|name}}( | 
| -  {%- for parameter in method.parameters -%} | 
| -      {{parameter.kind|dart_type}} {{parameter|name}}, | 
| -  {%- endfor -%} | 
| -      [Function responseFactory = null]) { | 
| -      var params = new {{request_struct|name}}(); | 
| -  {%- for parameter in method.parameters %} | 
| -      params.{{parameter|name}} = {{parameter|name}}; | 
| -  {%- endfor %} | 
| -      return _proxyImpl.sendMessageWithRequestId( | 
| -          params, | 
| -          _{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name, | 
| -          -1, | 
| -          bindings.MessageHeader.kMessageExpectsResponse); | 
| -    } | 
| -  {%- endif %} | 
| -  {%- endfor %} | 
| -} | 
| - | 
| - | 
| -class {{interface|name}}Proxy implements bindings.ProxyBase { | 
| -  final bindings.Proxy impl; | 
| -  {{interface|name}} ptr; | 
| - | 
| -  {{interface|name}}Proxy(_{{interface|name}}ProxyImpl proxyImpl) : | 
| -      impl = proxyImpl, | 
| -      ptr = new _{{interface|name}}ProxyCalls(proxyImpl); | 
| - | 
| +class {{interface|name}}Proxy extends bindings.Proxy | 
| +                              implements {{interface|name}} { | 
| {{interface|name}}Proxy.fromEndpoint( | 
| -      core.MojoMessagePipeEndpoint endpoint) : | 
| -      impl = new _{{interface|name}}ProxyImpl.fromEndpoint(endpoint) { | 
| -    ptr = new _{{interface|name}}ProxyCalls(impl); | 
| -  } | 
| +      core.MojoMessagePipeEndpoint endpoint) | 
| +      : super(new _{{interface|name}}ProxyControl.fromEndpoint(endpoint)); | 
|  | 
| -  {{interface|name}}Proxy.fromHandle(core.MojoHandle handle) : | 
| -      impl = new _{{interface|name}}ProxyImpl.fromHandle(handle) { | 
| -    ptr = new _{{interface|name}}ProxyCalls(impl); | 
| -  } | 
| +  {{interface|name}}Proxy.fromHandle(core.MojoHandle handle) | 
| +      : super(new _{{interface|name}}ProxyControl.fromHandle(handle)); | 
|  | 
| -  {{interface|name}}Proxy.unbound() : | 
| -      impl = new _{{interface|name}}ProxyImpl.unbound() { | 
| -    ptr = new _{{interface|name}}ProxyCalls(impl); | 
| +  {{interface|name}}Proxy.unbound() | 
| +      : super(new _{{interface|name}}ProxyControl.unbound()); | 
| + | 
| +  static {{interface|name}}Proxy newFromEndpoint( | 
| +      core.MojoMessagePipeEndpoint endpoint) { | 
| +    assert(endpoint.setDescription("For {{interface|name}}Proxy")); | 
| +    return new {{interface|name}}Proxy.fromEndpoint(endpoint); | 
| } | 
|  | 
| factory {{interface|name}}Proxy.connectToService( | 
| @@ -202,31 +146,44 @@ class {{interface|name}}Proxy implements bindings.ProxyBase { | 
| return p; | 
| } | 
|  | 
| -  static {{interface|name}}Proxy newFromEndpoint( | 
| -      core.MojoMessagePipeEndpoint endpoint) { | 
| -    assert(endpoint.setDescription("For {{interface|name}}Proxy")); | 
| -    return new {{interface|name}}Proxy.fromEndpoint(endpoint); | 
| -  } | 
| - | 
| -  String get serviceName => {{interface|name}}.serviceName; | 
| - | 
| -  Future close({bool immediate: false}) => impl.close(immediate: immediate); | 
| - | 
| -  Future responseOrError(Future f) => impl.responseOrError(f); | 
| - | 
| -  Future get errorFuture => impl.errorFuture; | 
| - | 
| -  int get version => impl.version; | 
| - | 
| -  Future<int> queryVersion() => impl.queryVersion(); | 
| - | 
| -  void requireVersion(int requiredVersion) { | 
| -    impl.requireVersion(requiredVersion); | 
| +{% for method in interface.methods %} | 
| +{%- if method.response_parameters == None %} | 
| +  void {{method|name}}( | 
| +{%- for parameter in method.parameters -%} | 
| +    {{parameter.kind|dart_type}} {{parameter|name}}{% if not loop.last %}, {% endif %} | 
| +{%- endfor -%} | 
| +{%- set request_struct = method.param_struct -%} | 
| +  ) { | 
| +    if (!ctrl.isBound) { | 
| +      ctrl.proxyError("The Proxy is closed."); | 
| +      return; | 
| +    } | 
| +    var params = new {{request_struct|name}}(); | 
| +{%- for parameter in method.parameters %} | 
| +    params.{{parameter|name}} = {{parameter|name}}; | 
| +{%- endfor %} | 
| +    ctrl.sendMessage(params, | 
| +        _{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name); | 
| } | 
| - | 
| -  String toString() { | 
| -    return "{{interface|name}}Proxy($impl)"; | 
| +{%- else %} | 
| +{%- set request_struct = method.param_struct %} | 
| +  dynamic {{method|name}}( | 
| +{%- for parameter in method.parameters -%} | 
| +    {{parameter.kind|dart_type}} {{parameter|name}}, | 
| +{%- endfor -%} | 
| +    [Function responseFactory = null]) { | 
| +    var params = new {{request_struct|name}}(); | 
| +{%- for parameter in method.parameters %} | 
| +    params.{{parameter|name}} = {{parameter|name}}; | 
| +{%- endfor %} | 
| +    return ctrl.sendMessageWithRequestId( | 
| +        params, | 
| +        _{{interface|name|lower_camel}}Method{{method|name|upper_camel}}Name, | 
| +        -1, | 
| +        bindings.MessageHeader.kMessageExpectsResponse); | 
| } | 
| +{%- endif %} | 
| +{%- endfor %} | 
| } | 
|  | 
|  | 
|  |