diff --git a/src/name-assignments/assignment-hash.cpp b/src/name-assignments/assignment-hash.cpp
index 4849324..ebcf6d0 100644
--- a/src/name-assignments/assignment-hash.cpp
+++ b/src/name-assignments/assignment-hash.cpp
@@ -31,40 +31,32 @@
     if (startIndex != factoryParam.size()) {
         paramList.push_back(factoryParam.substr(startIndex));
     }
-    return HashAssignmentFunc(paramList);
-}
+    return [paramList](const std::vector<std::tuple<std::string, std::string>> params){
+        if (params.size() > paramList.size() * 8) { // might be attack
+            BOOST_THROW_EXCEPTION(std::runtime_error("Too many extra parameters given"));
+        }
+        std::map<std::string, std::string> paramMap;
+        for (const auto& param : params) {
+            paramMap[std::get<0>(param)] = std::get<1>(param);
+        }
 
-AssignmentHash::HashAssignmentFunc::HashAssignmentFunc(std::list<std::string> paramList)
-    : m_paramList(std::move(paramList))
-{}
+        //construct name
+        PartialName name;
+        for (const auto& field : paramList) {
+            auto it = paramMap.find(field);
+            if (it == paramMap.end()) {
+                return std::vector<PartialName>();
+            } else {
+                name.append(it->second);
+            }
+        }
+        std::vector<PartialName> nameList;
+        util::Sha256 digest;
+        digest << name.wireEncode();
+        nameList.emplace_back(digest.toString());
 
-std::vector<PartialName>
-AssignmentHash::HashAssignmentFunc::operator() (const std::vector<std::tuple<std::string, std::string>> params)
-{
-  if (params.size() > m_paramList.size() * 8) { // might be attack
-      BOOST_THROW_EXCEPTION(std::runtime_error("Too many extra parameters given"));
-  }
-  std::map<std::string, std::string> paramMap;
-  for (const auto& param : params) {
-      paramMap[std::get<0>(param)] = std::get<1>(param);
-  }
-
-  //construct name
-  PartialName name;
-  for (const auto& field : m_paramList) {
-      auto it = paramMap.find(field);
-      if (it == paramMap.end()) {
-          return std::vector<PartialName>();
-      } else {
-          name.append(it->second);
-      }
-  }
-  std::vector<PartialName> nameList;
-  util::Sha256 digest;
-  digest << name.wireEncode();
-  nameList.emplace_back(digest.toString());
-
-  return nameList;
+        return nameList;
+    };
 }
 
 }
diff --git a/src/name-assignments/assignment-hash.hpp b/src/name-assignments/assignment-hash.hpp
index 19b0618..8ff253f 100644
--- a/src/name-assignments/assignment-hash.hpp
+++ b/src/name-assignments/assignment-hash.hpp
@@ -19,16 +19,6 @@
 
   NameAssignmentFunc getFunction(const std::string &factoryParam) override;
 
-  class HashAssignmentFunc {
-  public:
-    HashAssignmentFunc(std::list<std::string> paramList);
-
-    std::vector<PartialName>
-    operator() (const std::vector<std::tuple<std::string, std::string>> params);
-  private:
-    std::list<std::string> m_paramList;
-  };
-
 };
 }
 }
diff --git a/src/name-assignments/assignment-or.cpp b/src/name-assignments/assignment-or.cpp
index 6fc3e97..78cfc3e 100644
--- a/src/name-assignments/assignment-or.cpp
+++ b/src/name-assignments/assignment-or.cpp
@@ -18,7 +18,15 @@
 NameAssignmentFunc
 AssignmentOr::getFunction(std::list<NameAssignmentFunc> funcs){
     if (funcs.size() == 1) return *funcs.begin();
-    return OrAssignmentFunc(funcs);
+    return [funcs](const std::vector<std::tuple<std::string, std::string>> params){
+        std::vector<PartialName> nameList;
+        for (const auto& func : funcs) {
+            auto result = func(params);
+            nameList.insert(nameList.end(), result.begin(), result.end());
+        }
+
+        return nameList;
+    };
 }
 
 NameAssignmentFunc
@@ -51,21 +59,5 @@
     return getFunction(paramList);
 }
 
-AssignmentOr::OrAssignmentFunc::OrAssignmentFunc(std::list<NameAssignmentFunc> funcList)
-    : m_funcList(std::move(funcList))
-{}
-
-std::vector<PartialName>
-AssignmentOr::OrAssignmentFunc::operator() (const std::vector<std::tuple<std::string, std::string>> params)
-{
-  std::vector<PartialName> nameList;
-  for (const auto& func : m_funcList) {
-      auto result = func(params);
-      nameList.insert(nameList.end(), result.begin(), result.end());
-  }
-
-  return nameList;
-}
-
 }
 }
diff --git a/src/name-assignments/assignment-or.hpp b/src/name-assignments/assignment-or.hpp
index 68ffd66..8d056f3 100644
--- a/src/name-assignments/assignment-or.hpp
+++ b/src/name-assignments/assignment-or.hpp
@@ -21,16 +21,6 @@
 
   NameAssignmentFunc getFunction(const std::string &factoryParam) override;
 
-  class OrAssignmentFunc {
-  public:
-    OrAssignmentFunc(std::list<NameAssignmentFunc> funcList);
-
-    std::vector<PartialName>
-    operator() (const std::vector<std::tuple<std::string, std::string>> params);
-  private:
-    std::list<NameAssignmentFunc> m_funcList;
-  };
-
 };
 }
 }
diff --git a/src/name-assignments/assignment-param.cpp b/src/name-assignments/assignment-param.cpp
index c5cbf09..e32665e 100644
--- a/src/name-assignments/assignment-param.cpp
+++ b/src/name-assignments/assignment-param.cpp
@@ -30,40 +30,32 @@
     if (startIndex != factoryParam.size()) {
         paramList.push_back(factoryParam.substr(startIndex));
     }
-    return ParamAssignmentFunc(paramList);
-}
+    return [paramList](const std::vector<std::tuple<std::string, std::string>> params){
+        if (params.size() > paramList.size() * 8) { // might be attack
+            BOOST_THROW_EXCEPTION(std::runtime_error("Too many extra parameters given"));
+        }
+        std::map<std::string, std::string> paramMap;
+        for (const auto& param : params) {
+            paramMap[std::get<0>(param)] = std::get<1>(param);
+            if (std::get<1>(param).size() == 0) { // empty parameter!
+                return std::vector<PartialName>();
+            }
+        }
 
-AssignmentParam::ParamAssignmentFunc::ParamAssignmentFunc(std::list<std::string> paramList)
-    : m_paramList(std::move(paramList))
-{}
-
-std::vector<PartialName>
-AssignmentParam::ParamAssignmentFunc::operator() (const std::vector<std::tuple<std::string, std::string>> params)
-{
-  if (params.size() > m_paramList.size() * 8) { // might be attack
-      BOOST_THROW_EXCEPTION(std::runtime_error("Too many extra parameters given"));
-  }
-  std::map<std::string, std::string> paramMap;
-  for (const auto& param : params) {
-      paramMap[std::get<0>(param)] = std::get<1>(param);
-      if (std::get<1>(param).size() == 0) { // empty parameter!
-          return std::vector<PartialName>();
-      }
-  }
-
-  //construct name
-  PartialName name;
-  for (const auto& field : m_paramList) {
-      auto it = paramMap.find(field);
-      if (it == paramMap.end()) {
-          return std::vector<PartialName>();
-      } else {
-          name.append(it->second);
-      }
-  }
-  std::vector<PartialName> nameList;
-  nameList.push_back(name);
-  return nameList;
+        //construct name
+        PartialName name;
+        for (const auto& field : paramList) {
+            auto it = paramMap.find(field);
+            if (it == paramMap.end()) {
+                return std::vector<PartialName>();
+            } else {
+                name.append(it->second);
+            }
+        }
+        std::vector<PartialName> nameList;
+        nameList.push_back(name);
+        return nameList;
+    };
 }
 
 }
diff --git a/src/name-assignments/assignment-param.hpp b/src/name-assignments/assignment-param.hpp
index 7c6a377..c80f850 100644
--- a/src/name-assignments/assignment-param.hpp
+++ b/src/name-assignments/assignment-param.hpp
@@ -19,16 +19,6 @@
 
   NameAssignmentFunc getFunction(const std::string &factoryParam) override;
 
-  class ParamAssignmentFunc {
-  public:
-    ParamAssignmentFunc(std::list<std::string> paramList);
-
-    std::vector<PartialName>
-    operator() (const std::vector<std::tuple<std::string, std::string>> params);
-  private:
-    std::list<std::string> m_paramList;
-  };
-
 };
 }
 }
