JsValuePtr GlobalJsObject::Setup(JsEnginePtr jsEngine, const AppInfo& appInfo,
    JsValuePtr obj)
{
  obj->SetProperty("setTimeout", jsEngine->NewCallback(::SetTimeoutCallback));
  obj->SetProperty("_triggerEvent", jsEngine->NewCallback(::TriggerEventCallback));
  obj->SetProperty("_fileSystem",
      FileSystemJsObject::Setup(jsEngine, jsEngine->NewObject()));
  obj->SetProperty("_webRequest",
      WebRequestJsObject::Setup(jsEngine, jsEngine->NewObject()));
  obj->SetProperty("console",
      ConsoleJsObject::Setup(jsEngine, jsEngine->NewObject()));
  obj->SetProperty("_appInfo",
      AppInfoJsObject::Setup(jsEngine, appInfo, jsEngine->NewObject()));
  return obj;
}
JsValuePtr FileSystemJsObject::Setup(JsEnginePtr jsEngine, JsValuePtr obj)
{
  obj->SetProperty("read", jsEngine->NewCallback(::ReadCallback));
  obj->SetProperty("write", jsEngine->NewCallback(::WriteCallback));
  obj->SetProperty("move", jsEngine->NewCallback(::MoveCallback));
  obj->SetProperty("remove", jsEngine->NewCallback(::RemoveCallback));
  obj->SetProperty("stat", jsEngine->NewCallback(::StatCallback));
  obj->SetProperty("resolve", jsEngine->NewCallback(::ResolveCallback));
  return obj;
}