// Path: src/main/java/org/msgpack/rpc/reflect/Reflect.java
// public class Reflect {
//     /*
//      * private static final Reflect instance = new Reflect();
//      * 
//      * public static <T> Proxy<T> reflectProxy(Class<T> iface) { return
//      * instance.getProxy(iface); }
//      * 
//      * public static Invoker reflectInvoker(Method method) { return
//      * instance.getInvoker(method); }
//      */
// 
//     private Map<Class<?>, Proxy<?>> proxyCache = new HashMap<Class<?>, Proxy<?>>();
// 
//     private Map<Method, Invoker> invokerCache = new HashMap<Method, Invoker>();
// 
//     private InvokerBuilder invokerBuilder;
//     private ProxyBuilder proxyBuilder;
// 
//     public Reflect(MessagePack messagePack) {
//         invokerBuilder = new ReflectionInvokerBuilder(messagePack);
//         proxyBuilder = new ReflectionProxyBuilder(messagePack);
//     }
// 
//     public Reflect( InvokerBuilder invokerBuilder,ProxyBuilder proxyBuilder) {
//         this.invokerBuilder = invokerBuilder;
//         this.proxyBuilder = proxyBuilder;
//     }
// 
//     public synchronized <T> Proxy<T> getProxy(Class<T> iface) {
//         Proxy<?> proxy = proxyCache.get(iface);
//         if (proxy == null) {
//             proxy = proxyBuilder.buildProxy(iface);// ProxyBuilder.build(iface);
//             proxyCache.put(iface, proxy);
//         }
//         return (Proxy<T>) proxy;
//     }
// 
//     public synchronized Invoker getInvoker(Method method) {
//         Invoker invoker = invokerCache.get(method);
//         if (invoker == null) {
//             invoker = invokerBuilder.buildInvoker(method);
//             invokerCache.put(method, invoker);
//         }
//         return invoker;
//     }
// }


import org.msgpack.MessagePack;
import org.msgpack.rpc.dispatcher.Dispatcher;
import org.msgpack.rpc.dispatcher.MethodDispatcher;
import org.msgpack.rpc.reflect.Reflect;
package org.msgpack.rpc.builder;


/**
 * User: takeshita
 * Create: 12/06/15 1:16
 */
public class DefaultDispatcherBuilder implements DispatcherBuilder {

    public Dispatcher build(Object handler, MessagePack messagePack) {
        return new MethodDispatcher(
// Path: src/main/java/org/msgpack/rpc/reflect/Reflect.java
// public class Reflect {
//     /*
//      * private static final Reflect instance = new Reflect();
//      * 
//      * public static <T> Proxy<T> reflectProxy(Class<T> iface) { return
//      * instance.getProxy(iface); }
//      * 
//      * public static Invoker reflectInvoker(Method method) { return
//      * instance.getInvoker(method); }
//      */
// 
//     private Map<Class<?>, Proxy<?>> proxyCache = new HashMap<Class<?>, Proxy<?>>();
// 
//     private Map<Method, Invoker> invokerCache = new HashMap<Method, Invoker>();
// 
//     private InvokerBuilder invokerBuilder;
//     private ProxyBuilder proxyBuilder;
// 
//     public Reflect(MessagePack messagePack) {
//         invokerBuilder = new ReflectionInvokerBuilder(messagePack);
//         proxyBuilder = new ReflectionProxyBuilder(messagePack);
//     }
// 
//     public Reflect( InvokerBuilder invokerBuilder,ProxyBuilder proxyBuilder) {
//         this.invokerBuilder = invokerBuilder;
//         this.proxyBuilder = proxyBuilder;
//     }
// 
//     public synchronized <T> Proxy<T> getProxy(Class<T> iface) {
//         Proxy<?> proxy = proxyCache.get(iface);
//         if (proxy == null) {
//             proxy = proxyBuilder.buildProxy(iface);// ProxyBuilder.build(iface);
//             proxyCache.put(iface, proxy);
//         }
//         return (Proxy<T>) proxy;
//     }
// 
//     public synchronized Invoker getInvoker(Method method) {
//         Invoker invoker = invokerCache.get(method);
//         if (invoker == null) {
//             invoker = invokerBuilder.buildInvoker(method);
//             invokerCache.put(method, invoker);
//         }
//         return invoker;
//     }
// }


// Path: src/main/java/org/msgpack/rpc/builder/DefaultDispatcherBuilder.java
import org.msgpack.MessagePack;
import org.msgpack.rpc.dispatcher.Dispatcher;
import org.msgpack.rpc.dispatcher.MethodDispatcher;
import org.msgpack.rpc.reflect.Reflect;

package org.msgpack.rpc.builder;


/**
 * User: takeshita
 * Create: 12/06/15 1:16
 */
public class DefaultDispatcherBuilder implements DispatcherBuilder {

    public Dispatcher build(Object handler, MessagePack messagePack) {
        return new MethodDispatcher(
                new Reflect(messagePack), handler);