How to avoid the duplication in writing an API wrapper?

The topic may be unclear, please see the examples below.

For example,

 defmodule Wechat.API do
   def users(client), do: ...
 end

 defmodule Wechat.Client do
    defstruct [:appid, :secret]
    def new(opts), do: struct(Wechat.Client, opts)
 end

 defmodule Wechat do
    defmacro __using__(opts) do
       quote do
          def client, do: Wechat.Client.new(unquote(opts))
          def users, do: Wechat.API.users(client())  
       end
    end
 end

You can see, I provide API functions with client, and functions without client by use Wechat in user’s module. The second way is to simplify the usage.

The problem is for every API, I need to write two kinds of functions. Is it a correct way? Or is there a better way?

Thanks