@Override
    public Object invoke(Object proxy, Method method, Object[] args) {
        if (method.equals(EQUALS)) {
            return equals(proxy, args[0]);
        } else if (method.equals(HASH_CODE)) {
            return hashCode(proxy);
        } else if (method.equals(TO_STRING)) {
            return toString(proxy);
        } else {
            return invokeOthers(proxy, method, args);
        }
    }