content: /*
   * Created by LuaView.
   * Copyright (c) 2017, Alibaba Group. All rights reserved.
   *
   * This source code is licensed under the MIT.
   * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
   */
  
  package com.taobao.luaview.fun.base;
  
  import com.taobao.luaview.global.LuaViewConfig;
  import com.taobao.luaview.global.LuaViewManager;
  
  import org.luaj.vm2.LuaTable;
  import org.luaj.vm2.LuaValue;
  import org.luaj.vm2.lib.LibFunction;
  import org.luaj.vm2.lib.TwoArgFunction;
  
  /**
   * 基础两参数函数对象
   *
   * @author song
   * @date 15/8/14
   */
  public abstract class BaseFunctionBinder extends TwoArgFunction {
      public String[] luaNames;
  
      public BaseFunctionBinder(String... name) {
          this.luaNames = name;
      }
  
      public String[] getLuaNames() {
          return luaNames;
      }
  
      @Override
      public LuaValue call(LuaValue modname, LuaValue env) {
          return call(env, getMapperClass());
      }
  
      private LuaValue call(LuaValue env, Class<? extends LibFunction> libClass) {
          final LuaTable metatable = (libClass == null || LuaViewConfig.isLibsLazyLoad() == false) ? LuaViewManager.createMetatable(libClass) : null;//当不是lazyLoad或者lib为空（常量）的时候直接加载
          if (luaNames != null) {
              for (String name : luaNames) {
                  env.set(name, createCreator(env, metatable));
              }
          }
          return metatable;
      }
  
      public abstract Class<? extends LibFunction> getMapperClass();
  
      /**
       * 默认返回metatable，如果要使用对象方式调用，则返回一个LuaFunction
       *
       * @param env
       * @param metaTable
       * @return
       */
      public LuaValue createCreator(LuaValue env, LuaValue metaTable) {
          return metaTable;
      }
  }
  