From be9de068db5ad767687493634aef226a6ac42f4d Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Sun, 9 Jul 2017 21:21:59 +0200
Subject: [PATCH] use registration class to unify cast registration

---
 acast2/src/acast.cpp                          |  16 ++-
 .../src/automaton/transform/PDAToRHPDA.cpp    |   6 +-
 .../src/automaton/transform/RHPDAToPDA.cpp    |   6 +-
 alib2common/src/core/castApi.hpp              | 102 ++----------------
 alib2common/src/core/namingApi.hpp            |  47 ++++++++
 .../src/registration/CastRegistration.hpp     |  27 +++++
 .../src/registration/NameRegistration.hpp     |  19 ++++
 alib2data/src/automaton/FSM/CompactNFA.cpp    |  19 ++--
 alib2data/src/automaton/FSM/EpsilonNFA.cpp    |  13 +--
 alib2data/src/automaton/FSM/ExtendedNFA.cpp   |  17 +--
 .../automaton/FSM/MultiInitialStateNFA.cpp    |  11 +-
 alib2data/src/automaton/FSM/NFA.cpp           |   9 +-
 alib2data/src/automaton/PDA/DPDA.cpp          |   3 -
 alib2data/src/automaton/PDA/NPDA.cpp          |   3 -
 alib2data/src/automaton/PDA/NPDTA.cpp         |   3 -
 .../PDA/RealTimeHeightDeterministicDPDA.cpp   |   3 -
 .../PDA/RealTimeHeightDeterministicNPDA.cpp   |   3 -
 alib2data/src/grammar/ContextFree/CFG.cpp     |   6 +-
 alib2data/src/regexp/formal/FormalRegExp.cpp  |   9 +-
 .../src/regexp/unbounded/UnboundedRegExp.cpp  |   8 +-
 alib2data/src/rte/formal/FormalRTE.cpp        |   3 -
 alib2data/src/string/CyclicString.cpp         |   5 +-
 alib2data/src/string/LinearString.cpp         |  26 ++---
 .../src/tree/ranked/PostfixRankedTree.cpp     |   8 +-
 .../PrefixRankedBarNonlinearPattern.cpp       |  16 +--
 .../tree/ranked/PrefixRankedBarPattern.cpp    |  10 +-
 .../src/tree/ranked/PrefixRankedBarTree.cpp   |   8 +-
 .../ranked/PrefixRankedNonlinearPattern.cpp   |  16 +--
 .../src/tree/ranked/PrefixRankedPattern.cpp   |  10 +-
 .../src/tree/ranked/PrefixRankedTree.cpp      |   8 +-
 .../tree/ranked/RankedNonlinearPattern.cpp    |   1 -
 alib2data/src/tree/ranked/RankedPattern.cpp   |   8 +-
 alib2data/src/tree/ranked/RankedTree.cpp      |  10 +-
 alib2data/src/tree/unranked/PrefixBarTree.cpp |  14 +--
 .../unranked/UnrankedNonlinearPattern.cpp     |   1 -
 .../src/tree/unranked/UnrankedPattern.cpp     |   8 +-
 alib2data/src/tree/unranked/UnrankedTree.cpp  |   8 +-
 37 files changed, 262 insertions(+), 228 deletions(-)
 create mode 100644 alib2common/src/core/namingApi.hpp
 create mode 100644 alib2common/src/registration/CastRegistration.hpp
 create mode 100644 alib2common/src/registration/NameRegistration.hpp

diff --git a/acast2/src/acast.cpp b/acast2/src/acast.cpp
index 5ce6a1ff4c..25bd0c26fc 100644
--- a/acast2/src/acast.cpp
+++ b/acast2/src/acast.cpp
@@ -14,9 +14,21 @@
 #include <factory/XmlDataFactory.hpp>
 #include <object/Object.h>
 #include <core/castApi.hpp>
+#include <core/namingApi.hpp>
 
 // -----------------------------------------------------------------------------------------
 
+alib::Object doCast ( const alib::Object & in, const std::string & to ) {
+	const alib::ObjectBase & inObject = in.getData ( );
+	std::type_index inType = std::type_index ( typeid ( inObject ) );
+
+	for ( const std::type_index & toType : alib::namingApi::getTypes ( to ) )
+		if ( alib::castApi::getCastPool ( toType ).castAvailable ( inType ) )
+			return alib::castApi::getCastPool ( toType ).cast ( inObject );
+
+	throw exception::CommonException ( "Cast from " + std::type_name ( inType ) + " to " + to + " not available" );
+}
+
 int main(int argc, char** argv) {
 	try {
 		common::GlobalData::argc = argc;
@@ -51,12 +63,12 @@ int main(int argc, char** argv) {
 		measurements::end();
 		measurements::start("Cast", measurements::Type::MAIN);
 
-		alib::Object res = alib::castApi::getCastPool(type.getValue()).cast(in.getData());
+		alib::Object out = doCast ( in, type.getValue ( ) );
 
 		measurements::end();
 		measurements::start("Output write", measurements::Type::AUXILIARY);
 
-		alib::XmlDataFactory::toStdout(res);
+		alib::XmlDataFactory::toStdout(out);
 
 		measurements::end();
 		measurements::end();
diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
index 5b050b2426..11dd7ea3af 100644
--- a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
+++ b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
@@ -21,6 +21,8 @@
 #include <label/InitialStateLabel.h>
 #include <common/createUnique.hpp>
 
+#include <registration/CastRegistration.hpp>
+
 namespace automaton {
 
 automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const automaton::RealTimeHeightDeterministicDPDA < > & pda ) {
@@ -193,7 +195,7 @@ automaton::Automaton PDAToRHPDA::convert ( const Automaton & automaton ) {
 
 namespace alib {
 
-auto RealTimeHeightDeterministicDPDAFromDPDA = castApi::CastRegister < automaton::RealTimeHeightDeterministicDPDA < >, automaton::DPDA < > > ( automaton::PDAToRHPDA::convert );
-auto RealTimeHeightDeterministicNPDAFromNPDA = castApi::CastRegister < automaton::RealTimeHeightDeterministicNPDA < >, automaton::NPDA < > > ( automaton::PDAToRHPDA::convert );
+auto RealTimeHeightDeterministicDPDAFromDPDA = registration::CastRegister < automaton::RealTimeHeightDeterministicDPDA < >, automaton::DPDA < > > ( automaton::PDAToRHPDA::convert );
+auto RealTimeHeightDeterministicNPDAFromNPDA = registration::CastRegister < automaton::RealTimeHeightDeterministicNPDA < >, automaton::NPDA < > > ( automaton::PDAToRHPDA::convert );
 
 } /* namespace alib */
diff --git a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
index 550d7ffa54..2a618e9173 100644
--- a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
+++ b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
@@ -20,6 +20,8 @@
 #include <queue>
 #include <iostream>
 
+#include <registration/CastRegistration.hpp>
+
 namespace automaton {
 
 template < class T >
@@ -279,7 +281,7 @@ automaton::Automaton RHPDAToPDA::convert ( const Automaton & automaton ) {
 
 namespace alib {
 
-auto DPDAFromRealTimeHeightDeterministicNPDA = castApi::CastRegister < automaton::DPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( automaton::RHPDAToPDA::convert );
-auto NPDAFromRealTimeHeightDeterministicNPDA = castApi::CastRegister < automaton::NPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( automaton::RHPDAToPDA::convert );
+auto DPDAFromRealTimeHeightDeterministicNPDA = registration::CastRegister < automaton::DPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( automaton::RHPDAToPDA::convert );
+auto NPDAFromRealTimeHeightDeterministicNPDA = registration::CastRegister < automaton::NPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( automaton::RHPDAToPDA::convert );
 
 } /* namespace alib */
diff --git a/alib2common/src/core/castApi.hpp b/alib2common/src/core/castApi.hpp
index 3379955b78..ca3cde212b 100644
--- a/alib2common/src/core/castApi.hpp
+++ b/alib2common/src/core/castApi.hpp
@@ -17,11 +17,10 @@
 #include "../object/Object.h"
 #include "../exception/CommonException.h"
 
-#include <introspection/Casts.hpp>
-
 namespace alib {
 
 struct castApi {
+private:
 	class CastPoolBase {
 	protected:
 		std::map < std::type_index, std::function < alib::Object ( const alib::ObjectBase & ) > > castFunctions;
@@ -54,31 +53,25 @@ struct castApi {
 	class CastPool : public CastPoolBase {
 	public:
 		template < class From >
-		void add ( ) {
-			bool res = castFunctions.insert ( std::make_pair ( std::type_index ( typeid ( From ) ), [] ( const alib::ObjectBase & from ) { return alib::Object ( To ( ( const From & ) from ) ); } ) ).second;
+		void add ( std::function < To ( const From & ) > castFunction ) {
+			bool res = castFunctions.insert ( std::make_pair ( std::type_index ( typeid ( From ) ), [=] ( const alib::ObjectBase & from ) {
+					return alib::Object ( castFunction ( static_cast < const From & > ( from ) ) );
+				} ) ).second;
 			if ( ! res ) {
 				std::string fromName = std::type_name < From > ( );
 				std::string toName = std::type_name < To > ( );
 
 				throw::exception::CommonException ( "Casting from " + fromName + " to " + toName + " already registered." );
 			}
-
-			introspection::Casts::registerCast < From, To > ( );
 		}
 
 		template < class From >
-		void add ( To ( * castFunction )( const From & ) ) {
-			bool res = castFunctions.insert ( std::make_pair ( std::type_index ( typeid ( From ) ), [=] ( const alib::ObjectBase & from ) {
-					return alib::Object ( ( ( To ( * )( const alib::ObjectBase & ) )castFunction )( from ) );
-				} ) ).second;
-			if ( ! res ) {
-				std::string fromName = std::type_name < From > ( );
-				std::string toName = std::type_name < To > ( );
-
-				throw::exception::CommonException ( "Casting from " + fromName + " to " + toName + " already registered." );
-			}
+		void add ( ) {
+			auto castFunction = [] ( const From & from ) -> To {
+				return To ( from );
+			};
 
-			introspection::Casts::registerCast < From, To > ( );
+			add < From > ( castFunction );
 		}
 
 		To explicitCast ( const alib::ObjectBase & from ) {
@@ -115,13 +108,6 @@ private:
 		return res;
 	}
 
-	 // INFO: Function exist to handle static order of initialisation
-	static std::multimap < std::string, CastPoolBase * > & castFunctionsByString ( ) {
-		static std::multimap < std::string, CastPoolBase * > res;
-
-		return res;
-	}
-
 public:
 	static CastPoolBase & getCastPool ( std::type_index typeId ) {
 		std::map < std::type_index, CastPoolBase * >::iterator res = castFunctionsById ( ).find ( typeId );
@@ -162,74 +148,6 @@ public:
 		return castAvailable ( std::type_index ( typeid ( To ) ), std::type_index ( typeid ( From ) ) );
 	}
 
-	template < class To >
-	class CastPoolStringBinder {
-	public:
-		CastPoolStringBinder ( std::string tagName ) {
-			CastPoolBase * castPool = & getCastPool < To > ( );
-
-			std::pair < std::multimap < std::string, CastPoolBase * >::iterator, std::multimap < std::string, CastPoolBase * >::iterator > res = castFunctionsByString ( ).equal_range ( tagName );
-			for ( std::multimap < std::string, CastPoolBase * >::iterator iter = res.first; iter != res.second; ++ iter ) {
-				if ( iter->second == castPool ) {
-					std::string toName = std::type_name < To > ( );
-
-					throw::exception::CommonException ( "String cast pool for " + toName + "already exists." );
-				}
-			}
-
-			castFunctionsByString ( ).insert ( std::make_pair ( tagName, castPool ) );
-		}
-
-	};
-
-	class CastPoolBases {
-		std::pair < std::multimap < std::string, CastPoolBase * >::iterator, std::multimap < std::string, CastPoolBase * >::iterator > m_CastPoolBaseRange;
-
-	public:
-		CastPoolBases ( std::pair < std::multimap < std::string, CastPoolBase * >::iterator, std::multimap < std::string, CastPoolBase * >::iterator > castPoolBaseRange ) : m_CastPoolBaseRange ( castPoolBaseRange ) {
-		}
-
-		alib::Object cast ( const alib::ObjectBase & from ) {
-			for ( std::multimap < std::string, CastPoolBase * >::iterator iter = m_CastPoolBaseRange.first; iter != m_CastPoolBaseRange.second; ++ iter )
-				if ( iter->second->castAvailable ( std::type_index ( typeid ( from ) ) ) )
-					return iter->second->cast ( from );
-
-			std::string fromType = std::type_name ( typeid ( from ) );
-	
-			throw exception::CommonException ( "Bad cast: From: " + fromType + " To: " + m_CastPoolBaseRange.first->first );
-		}
-
-		bool castAvailable ( std::type_index from ) {
-			for ( std::multimap < std::string, CastPoolBase * >::iterator iter = m_CastPoolBaseRange.first; iter != m_CastPoolBaseRange.second; ++ iter )
-				if ( iter->second->castAvailable ( from ) )
-					return true;
-
-			return false;
-		}
-	};
-
-	static CastPoolBases getCastPool ( const std::string & tagName ) {
-		std::pair < std::multimap < std::string, CastPoolBase * >::iterator, std::multimap < std::string, CastPoolBase * >::iterator > res = castFunctionsByString ( ).equal_range ( tagName );
-
-		if ( res.first == res.second )
-			throw exception::CommonException ( "Casting to type " + tagName + " not available." );
-		else
-			return CastPoolBases ( res );
-	}
-
-	template < class To, class From >
-	class CastRegister {
-	public:
-		CastRegister ( ) {
-			getCastPool < To > ( ).template add < From > ( );
-		}
-
-		CastRegister ( To ( * castFunction ) ( const From & ) ) {
-			getCastPool < To > ( ).template add < From > ( castFunction );
-		}
-
-	};
-
 };
 
 } /* namespace alib */
diff --git a/alib2common/src/core/namingApi.hpp b/alib2common/src/core/namingApi.hpp
new file mode 100644
index 0000000000..a463d138ef
--- /dev/null
+++ b/alib2common/src/core/namingApi.hpp
@@ -0,0 +1,47 @@
+/*
+ * namingApi.hpp
+ *
+ * Created on: Jul 7, 2017
+ * Author: Jan Travnicek
+ */
+
+#ifndef NAMING_API_HPP_
+#define NAMING_API_HPP_
+
+#include <map>
+#include <set>
+#include <string>
+#include <typeindex>
+
+#include <exception/CommonException.h>
+
+namespace alib {
+
+class namingApi {
+	static std::map < std::string, std::set < std::type_index > > & getNames ( ) {
+		static std::map < std::string, std::set < std::type_index > > names;
+		return names;
+	}
+
+public:
+	template < typename Type >
+	static void registerName ( std::string name ) {
+		std::type_index type = std::type_index ( typeid ( Type ) );
+		std::pair < std::set < std::type_index >::iterator, bool > res = getNames ( ) [ name ].insert ( type );
+		if ( ! res.second && * res.first != type )
+			throw exception::CommonException ( "Type for name " + name + " already registered.");
+	}
+
+	static std::set < std::type_index > & getTypes ( std::string stringname ) {
+		auto name = getNames ( ).find ( stringname );
+		if ( name == getNames ( ).end ( ) )
+			throw exception::CommonException ( "Types for name " + stringname + " not registered.");
+
+		return name->second;
+	}
+
+};
+
+} /* namespace alib */
+
+#endif /* CAST_API_HPP_ */
diff --git a/alib2common/src/registration/CastRegistration.hpp b/alib2common/src/registration/CastRegistration.hpp
new file mode 100644
index 0000000000..8d42e2e997
--- /dev/null
+++ b/alib2common/src/registration/CastRegistration.hpp
@@ -0,0 +1,27 @@
+#ifndef _CAST_REGISTRATION_HPP_
+#define _CAST_REGISTRATION_HPP_
+
+#include <core/castApi.hpp>
+#include <introspection/Casts.hpp>
+
+namespace registration {
+
+template < class To, class From >
+class CastRegister {
+public:
+	CastRegister ( ) {
+		alib::castApi::getCastPool < To > ( ).template add < From > ( );
+
+		introspection::Casts::registerCast < From, To > ( );
+	}
+
+	CastRegister ( To ( * castFunction ) ( const From & ) ) {
+		alib::castApi::getCastPool < To > ( ).template add < From > ( castFunction );
+
+		introspection::Casts::registerCast < From, To > ( );
+	}
+};
+
+} /* namespace registration */
+
+#endif // _CAST_REGISTRATION_HPP_
diff --git a/alib2common/src/registration/NameRegistration.hpp b/alib2common/src/registration/NameRegistration.hpp
new file mode 100644
index 0000000000..13e8ac7475
--- /dev/null
+++ b/alib2common/src/registration/NameRegistration.hpp
@@ -0,0 +1,19 @@
+#ifndef _NAME_REGISTRATION_HPP_
+#define _NAME_REGISTRATION_HPP_
+
+#include <core/namingApi.hpp>
+#include <string>
+
+namespace registration {
+
+template < class Type >
+class NameRegister {
+public:
+	NameRegister ( std::string name ) {
+		alib::namingApi::registerName < Type > ( std::move ( name ) );
+	}
+};
+
+} /* namespace registration */
+
+#endif // _NAME_REGISTRATION_HPP_
diff --git a/alib2data/src/automaton/FSM/CompactNFA.cpp b/alib2data/src/automaton/FSM/CompactNFA.cpp
index 29975eac55..ea24737519 100644
--- a/alib2data/src/automaton/FSM/CompactNFA.cpp
+++ b/alib2data/src/automaton/FSM/CompactNFA.cpp
@@ -9,22 +9,19 @@
 #include "../Automaton.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-
-#include <core/castApi.hpp>
-
-namespace automaton {
-
-} /* namespace automaton */
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
 auto compactNFAType = registration::TypeRegister < automaton::Automaton, automaton::CompactNFA < > > ( );
 auto compactNFAType2 = registration::TypeRegister < alib::Object, automaton::CompactNFA < > > ( );
 
-auto CompactNFAFromDFA = castApi::CastRegister < automaton::CompactNFA < >, automaton::DFA < > > ( );
-auto CompactNFAFromNFA = castApi::CastRegister < automaton::CompactNFA < >, automaton::NFA < > > ( );
-auto CompactNFAFromMultiInitialStateNFA = castApi::CastRegister < automaton::CompactNFA < >, automaton::MultiInitialStateNFA < > > ( );
-auto CompactNFAEpsilonNFA = castApi::CastRegister < automaton::CompactNFA < >, automaton::EpsilonNFA < > > ( );
-auto CompactNFACastBinder = castApi::CastPoolStringBinder < automaton::CompactNFA < > > ( automaton::CompactNFA < >::getXmlTagName() );
+auto CompactNFAFromDFA = registration::CastRegister < automaton::CompactNFA < >, automaton::DFA < > > ( );
+auto CompactNFAFromNFA = registration::CastRegister < automaton::CompactNFA < >, automaton::NFA < > > ( );
+auto CompactNFAFromMultiInitialStateNFA = registration::CastRegister < automaton::CompactNFA < >, automaton::MultiInitialStateNFA < > > ( );
+auto CompactNFAEpsilonNFA = registration::CastRegister < automaton::CompactNFA < >, automaton::EpsilonNFA < > > ( );
+
+auto CompactNFAName = registration::NameRegister < automaton::CompactNFA < > > ( automaton::CompactNFA < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.cpp b/alib2data/src/automaton/FSM/EpsilonNFA.cpp
index 8eb2a1cb8f..dd5cc40d8a 100644
--- a/alib2data/src/automaton/FSM/EpsilonNFA.cpp
+++ b/alib2data/src/automaton/FSM/EpsilonNFA.cpp
@@ -9,17 +9,18 @@
 #include "../Automaton.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
 auto epsilonNFAType = registration::TypeRegister < automaton::Automaton, automaton::EpsilonNFA < > > ( );
 auto epsilonNFAType2 = registration::TypeRegister < alib::Object, automaton::EpsilonNFA < > > ( );
 
-auto EpsilonNFAFromDFA = castApi::CastRegister < automaton::EpsilonNFA < >, automaton::DFA < > > ( );
-auto EpsilonNFAFromNFA = castApi::CastRegister < automaton::EpsilonNFA < >, automaton::NFA < > > ( );
-auto EpsilonNFAFromMultiInitialStateNFA = castApi::CastRegister < automaton::EpsilonNFA < >, automaton::MultiInitialStateNFA < > > ( );
-auto EpsilonNFACastBinder = castApi::CastPoolStringBinder < automaton::EpsilonNFA < > > ( automaton::EpsilonNFA < >::getXmlTagName() );
+auto EpsilonNFAFromDFA = registration::CastRegister < automaton::EpsilonNFA < >, automaton::DFA < > > ( );
+auto EpsilonNFAFromNFA = registration::CastRegister < automaton::EpsilonNFA < >, automaton::NFA < > > ( );
+auto EpsilonNFAFromMultiInitialStateNFA = registration::CastRegister < automaton::EpsilonNFA < >, automaton::MultiInitialStateNFA < > > ( );
+
+auto EpsilonNFAName = registration::NameRegister < automaton::EpsilonNFA < > > ( automaton::EpsilonNFA < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.cpp b/alib2data/src/automaton/FSM/ExtendedNFA.cpp
index ade894859e..6f11c0feec 100644
--- a/alib2data/src/automaton/FSM/ExtendedNFA.cpp
+++ b/alib2data/src/automaton/FSM/ExtendedNFA.cpp
@@ -9,19 +9,20 @@
 #include "../Automaton.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
 auto extendedNFAType = registration::TypeRegister < automaton::Automaton, automaton::ExtendedNFA < > > ( );
 auto extendedNFAType2 = registration::TypeRegister < alib::Object, automaton::ExtendedNFA < > > ( );
 
-auto ExtendedNFAFromDFA = castApi::CastRegister < automaton::ExtendedNFA < >, automaton::DFA < > > ( );
-auto ExtendedNFAFromNFA = castApi::CastRegister < automaton::ExtendedNFA < >, automaton::NFA < > > ( );
-auto ExtendedNFAFromMultiInitialStateNFA = castApi::CastRegister < automaton::ExtendedNFA < >, automaton::MultiInitialStateNFA < > > ( );
-auto ExtendedNFAEpsilonNFA = castApi::CastRegister < automaton::ExtendedNFA < >, automaton::EpsilonNFA < > > ( );
-auto ExtendedNFACompactNFA = castApi::CastRegister < automaton::ExtendedNFA < >, automaton::CompactNFA < > > ( );
-auto ExtendedNFACastBinder = castApi::CastPoolStringBinder < automaton::ExtendedNFA < > > ( automaton::ExtendedNFA < >::getXmlTagName() );
+auto ExtendedNFAFromDFA = registration::CastRegister < automaton::ExtendedNFA < >, automaton::DFA < > > ( );
+auto ExtendedNFAFromNFA = registration::CastRegister < automaton::ExtendedNFA < >, automaton::NFA < > > ( );
+auto ExtendedNFAFromMultiInitialStateNFA = registration::CastRegister < automaton::ExtendedNFA < >, automaton::MultiInitialStateNFA < > > ( );
+auto ExtendedNFAEpsilonNFA = registration::CastRegister < automaton::ExtendedNFA < >, automaton::EpsilonNFA < > > ( );
+auto ExtendedNFACompactNFA = registration::CastRegister < automaton::ExtendedNFA < >, automaton::CompactNFA < > > ( );
+
+auto ExtendedNFAName = registration::NameRegister < automaton::ExtendedNFA < > > ( automaton::ExtendedNFA < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp b/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp
index 0eabd35e7d..98922e2a19 100644
--- a/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp
+++ b/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp
@@ -9,16 +9,17 @@
 #include "../Automaton.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
 auto multiInitialStateNFAType = registration::TypeRegister < automaton::Automaton, automaton::MultiInitialStateNFA < > > ( );
 auto multiInitialStateNFAType2 = registration::TypeRegister < alib::Object, automaton::MultiInitialStateNFA < > > ( );
 
-auto MultiInitialStateNFAFromDFA = castApi::CastRegister < automaton::MultiInitialStateNFA < >, automaton::DFA < > > ( );
-auto MultiInitialStateNFAFromNFA = castApi::CastRegister < automaton::MultiInitialStateNFA < >, automaton::NFA < > > ( );
-auto MultiInitialStateNFACastBinder = castApi::CastPoolStringBinder < automaton::MultiInitialStateNFA < > > ( automaton::MultiInitialStateNFA < >::getXmlTagName() );
+auto MultiInitialStateNFAFromDFA = registration::CastRegister < automaton::MultiInitialStateNFA < >, automaton::DFA < > > ( );
+auto MultiInitialStateNFAFromNFA = registration::CastRegister < automaton::MultiInitialStateNFA < >, automaton::NFA < > > ( );
+
+auto MultiInitialStateNFAName = registration::NameRegister < automaton::MultiInitialStateNFA < > > ( automaton::MultiInitialStateNFA < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/automaton/FSM/NFA.cpp b/alib2data/src/automaton/FSM/NFA.cpp
index bf24cca718..72e8738c48 100644
--- a/alib2data/src/automaton/FSM/NFA.cpp
+++ b/alib2data/src/automaton/FSM/NFA.cpp
@@ -9,15 +9,16 @@
 #include "../Automaton.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
 auto NFAType = registration::TypeRegister < automaton::Automaton, automaton::NFA < > > ( );
 auto NFAType2 = registration::TypeRegister < alib::Object, automaton::NFA < > > ( );
 
-auto NFAFromDFA = castApi::CastRegister < automaton::NFA < >, automaton::DFA < > > ( );
-auto NFACastBinder = castApi::CastPoolStringBinder < automaton::NFA < > > ( automaton::NFA < >::getXmlTagName() );
+auto NFAFromDFA = registration::CastRegister < automaton::NFA < >, automaton::DFA < > > ( );
+
+auto NFAName = registration::NameRegister < automaton::NFA < > > ( automaton::NFA < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/automaton/PDA/DPDA.cpp b/alib2data/src/automaton/PDA/DPDA.cpp
index aaba74d9f8..26f020caee 100644
--- a/alib2data/src/automaton/PDA/DPDA.cpp
+++ b/alib2data/src/automaton/PDA/DPDA.cpp
@@ -9,13 +9,10 @@
 #include "../Automaton.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
 
 namespace alib {
 
 auto DPDAType = registration::TypeRegister < automaton::Automaton, automaton::DPDA < > > ( );
 auto DPDAType2 = registration::TypeRegister < alib::Object, automaton::DPDA < > > ( );
 
-auto DPDACastBinder = castApi::CastPoolStringBinder<automaton::DPDA < > >(automaton::DPDA < >::getXmlTagName());
-
 } /* namespace alib */
diff --git a/alib2data/src/automaton/PDA/NPDA.cpp b/alib2data/src/automaton/PDA/NPDA.cpp
index 9115fef9fd..f186774171 100644
--- a/alib2data/src/automaton/PDA/NPDA.cpp
+++ b/alib2data/src/automaton/PDA/NPDA.cpp
@@ -9,13 +9,10 @@
 #include "../Automaton.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
 
 namespace alib {
 
 auto NPDAType = registration::TypeRegister < automaton::Automaton, automaton::NPDA < > > ( );
 auto NPDAType2 = registration::TypeRegister < alib::Object, automaton::NPDA < > > ( );
 
-auto NPDACastBinder = castApi::CastPoolStringBinder<automaton::NPDA < > >(automaton::NPDA < >::getXmlTagName());
-
 } /* namespace alib */
diff --git a/alib2data/src/automaton/PDA/NPDTA.cpp b/alib2data/src/automaton/PDA/NPDTA.cpp
index 47e80d8d34..f9cfe35ea5 100644
--- a/alib2data/src/automaton/PDA/NPDTA.cpp
+++ b/alib2data/src/automaton/PDA/NPDTA.cpp
@@ -9,13 +9,10 @@
 #include "../Automaton.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
 
 namespace alib {
 
 auto NPDTAType = registration::TypeRegister < automaton::Automaton, automaton::NPDTA < > > ( );
 auto NPDTAType2 = registration::TypeRegister < alib::Object, automaton::NPDTA < > > ( );
 
-auto NPDTACastBinder = castApi::CastPoolStringBinder<automaton::NPDTA < > >(automaton::NPDTA < >::getXmlTagName());
-
 } /* namespace alib */
diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp
index e82f6b04a6..c53dedb6b6 100644
--- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp
+++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp
@@ -9,13 +9,10 @@
 #include "../Automaton.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
 
 namespace alib {
 
 auto realTimeHeightDeterministicDPDAType = registration::TypeRegister < automaton::Automaton, automaton::RealTimeHeightDeterministicDPDA < > > ( );
 auto realTimeHeightDeterministicDPDAType2 = registration::TypeRegister < alib::Object, automaton::RealTimeHeightDeterministicDPDA < > > ( );
 
-auto RealTimeHeightDeterministicDPDACastBinder = castApi::CastPoolStringBinder<automaton::RealTimeHeightDeterministicDPDA < > >(automaton::RealTimeHeightDeterministicDPDA < >::getXmlTagName());
-
 } /* namespace alib */
diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp
index 9f7d4e0d81..a8d59e4e32 100644
--- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp
+++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp
@@ -9,13 +9,10 @@
 #include "../Automaton.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
 
 namespace alib {
 
 auto realTimeHeightDeterministicNPDAType = registration::TypeRegister < automaton::Automaton, automaton::RealTimeHeightDeterministicNPDA < > > ( );
 auto realTimeHeightDeterministicNPDAType2 = registration::TypeRegister < alib::Object, automaton::RealTimeHeightDeterministicNPDA < > > ( );
 
-auto RealTimeHeightDeterministicNPDACastBinder = castApi::CastPoolStringBinder<automaton::RealTimeHeightDeterministicNPDA < > >(automaton::RealTimeHeightDeterministicNPDA < >::getXmlTagName());
-
 } /* namespace alib */
diff --git a/alib2data/src/grammar/ContextFree/CFG.cpp b/alib2data/src/grammar/ContextFree/CFG.cpp
index 3a4dce0d19..8e73c7d0a9 100644
--- a/alib2data/src/grammar/ContextFree/CFG.cpp
+++ b/alib2data/src/grammar/ContextFree/CFG.cpp
@@ -9,15 +9,13 @@
 #include "../Grammar.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
 
 namespace alib {
 
 auto CFGType = registration::TypeRegister < grammar::Grammar, grammar::CFG < > > ( );
 auto CFGType2 = registration::TypeRegister < alib::Object, grammar::CFG < > > ( );
 
-auto CFGEpsilonFreeCFG = castApi::CastRegister < grammar::CFG < >, grammar::EpsilonFreeCFG < > > ( );
-auto CFGCastBinder = castApi::CastPoolStringBinder < grammar::CFG < > > ( grammar::CFG < >::getXmlTagName() );
+auto CFGEpsilonFreeCFG = registration::CastRegister < grammar::CFG < >, grammar::EpsilonFreeCFG < > > ( );
 
 } /* namespace alib */
diff --git a/alib2data/src/regexp/formal/FormalRegExp.cpp b/alib2data/src/regexp/formal/FormalRegExp.cpp
index 94a7e8b51e..13f5791a6d 100644
--- a/alib2data/src/regexp/formal/FormalRegExp.cpp
+++ b/alib2data/src/regexp/formal/FormalRegExp.cpp
@@ -9,15 +9,16 @@
 #include "../RegExp.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
 auto formalRegExpType = registration::TypeRegister < regexp::RegExp, regexp::FormalRegExp < > > ( );
 auto formalRegExpType2 = registration::TypeRegister < alib::Object, regexp::FormalRegExp < > > ( );
 
-auto FormalRegExpFromUnboundedRegExp = castApi::CastRegister < regexp::FormalRegExp < >, regexp::UnboundedRegExp < > > ( );
-auto FormalRegExpCastBinder = castApi::CastPoolStringBinder < regexp::FormalRegExp < > > ( regexp::FormalRegExp < >::getXmlTagName() );
+auto FormalRegExpFromUnboundedRegExp = registration::CastRegister < regexp::FormalRegExp < >, regexp::UnboundedRegExp < > > ( );
+
+auto FormalRegExpName = registration::NameRegister < regexp::FormalRegExp < > > ( regexp::FormalRegExp < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/regexp/unbounded/UnboundedRegExp.cpp b/alib2data/src/regexp/unbounded/UnboundedRegExp.cpp
index 2cc259f294..c9eee6c9b6 100644
--- a/alib2data/src/regexp/unbounded/UnboundedRegExp.cpp
+++ b/alib2data/src/regexp/unbounded/UnboundedRegExp.cpp
@@ -9,14 +9,16 @@
 #include "../RegExp.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
 auto unboundedRegExpType = registration::TypeRegister < regexp::RegExp, regexp::UnboundedRegExp < > > ( );
 auto unboundedRegExpType2 = registration::TypeRegister < alib::Object, regexp::UnboundedRegExp < > > ( );
 
-auto UnboundedRegExpFromFormalRegExp = castApi::CastRegister < regexp::UnboundedRegExp < >, regexp::FormalRegExp < > > ( );
-auto UnboundedRegExpCastBinder = castApi::CastPoolStringBinder < regexp::UnboundedRegExp < > > ( regexp::UnboundedRegExp < >::getXmlTagName() );
+auto UnboundedRegExpFromFormalRegExp = registration::CastRegister < regexp::UnboundedRegExp < >, regexp::FormalRegExp < > > ( );
+
+auto UnboundedRegExpName = registration::NameRegister < regexp::UnboundedRegExp < > > ( regexp::UnboundedRegExp < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/rte/formal/FormalRTE.cpp b/alib2data/src/rte/formal/FormalRTE.cpp
index 879420b1b7..1890ed238d 100644
--- a/alib2data/src/rte/formal/FormalRTE.cpp
+++ b/alib2data/src/rte/formal/FormalRTE.cpp
@@ -8,7 +8,6 @@
 #include "FormalRTE.h"
 #include "../RTE.h"
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
 #include <object/Object.h>
 
 namespace alib {
@@ -16,6 +15,4 @@ namespace alib {
 auto formalRTEType = registration::TypeRegister < rte::RTE, rte::FormalRTE < > > ( );
 auto formalRTEType2 = registration::TypeRegister < alib::Object, rte::FormalRTE < > > ( );
 
-auto FormalRTECastBinder = castApi::CastPoolStringBinder < rte::FormalRTE < > > ( rte::FormalRTE < >::getXmlTagName ( ) );
-
 } /* namespace alib */
diff --git a/alib2data/src/string/CyclicString.cpp b/alib2data/src/string/CyclicString.cpp
index 701efc9a1f..dd8520dd62 100644
--- a/alib2data/src/string/CyclicString.cpp
+++ b/alib2data/src/string/CyclicString.cpp
@@ -9,14 +9,13 @@
 #include "String.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
 
 namespace alib {
 
 auto cyclicStringType = registration::TypeRegister < string::String, string::CyclicString < > > ();
 auto cyclicStringType2 = registration::TypeRegister < alib::Object, string::CyclicString < > > ();
 
-auto CyclicStringFromEpsilon = castApi::CastRegister<string::CyclicString < >, string::Epsilon < > >();
-auto CyclicStringCastBinder = castApi::CastPoolStringBinder<string::CyclicString < > >(string::CyclicString < >::getXmlTagName());
+auto CyclicStringFromEpsilon = registration::CastRegister < string::CyclicString < >, string::Epsilon < > > ( );
 
 } /* namespace alib */
diff --git a/alib2data/src/string/LinearString.cpp b/alib2data/src/string/LinearString.cpp
index f5ef9ab65c..684d0170ff 100644
--- a/alib2data/src/string/LinearString.cpp
+++ b/alib2data/src/string/LinearString.cpp
@@ -10,23 +10,25 @@
 #include "String.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
 auto linearStringType = registration::TypeRegister < string::String, string::LinearString < > > ( );
 auto linearStringType2 = registration::TypeRegister < alib::Object, string::LinearString < > > ( );
 
-auto LinearStringFromEpsilon = castApi::CastRegister < string::LinearString < >, string::Epsilon < > > ( );
-auto LinearStringFromPrefixBarTree = castApi::CastRegister < string::LinearString < >, tree::PrefixBarTree < > > ( );
-auto LinearStringCastBinder = castApi::CastPoolStringBinder < string::LinearString < > > ( string::LinearString < >::getXmlTagName() );
-
-auto LinearStringFromPrefixRankedTree = castApi::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedTree < > > ( );
-auto LinearStringFromPrefixRankedPattern = castApi::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedPattern < > > ( );
-auto LinearStringFromPrefixRankedNonlinearPattern = castApi::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedNonlinearPattern < > > ( );
-auto LinearStringFromPrefixRankedBarTree = castApi::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarTree < > > ( );
-auto LinearStringFromPrefixRankedBarPattern = castApi::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarPattern < > > ( );
-auto LinearStringFromPrefixRankedBarNonlinearPattern = castApi::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarNonlinearPattern < > > ( );
-auto LinearStringCastBinderTree = castApi::CastPoolStringBinder < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > > > ( string::LinearString < >::getXmlTagName() );
+auto LinearStringFromEpsilon = registration::CastRegister < string::LinearString < >, string::Epsilon < > > ( );
+auto LinearStringFromPrefixBarTree = registration::CastRegister < string::LinearString < >, tree::PrefixBarTree < > > ( );
+
+auto LinearStringFromPrefixRankedTree = registration::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedTree < > > ( );
+auto LinearStringFromPrefixRankedPattern = registration::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedPattern < > > ( );
+auto LinearStringFromPrefixRankedNonlinearPattern = registration::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedNonlinearPattern < > > ( );
+auto LinearStringFromPrefixRankedBarTree = registration::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarTree < > > ( );
+auto LinearStringFromPrefixRankedBarPattern = registration::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarPattern < > > ( );
+auto LinearStringFromPrefixRankedBarNonlinearPattern = registration::CastRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarNonlinearPattern < > > ( );
+
+auto LinearStringName = registration::NameRegister < string::LinearString < > > ( string::LinearString < >::getXmlTagName ( ) );
+auto LinearStringName2 = registration::NameRegister < string::LinearString < std::ranked_symbol < DefaultSymbolType, DefaultRankType > > > ( string::LinearString < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PostfixRankedTree.cpp b/alib2data/src/tree/ranked/PostfixRankedTree.cpp
index c9f608d7a7..10e399e719 100644
--- a/alib2data/src/tree/ranked/PostfixRankedTree.cpp
+++ b/alib2data/src/tree/ranked/PostfixRankedTree.cpp
@@ -10,7 +10,8 @@
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
@@ -18,7 +19,8 @@ auto postfixRankedTreeType = registration::TypeRegister < ::tree::Tree, ::tree::
 auto postfixRankedTreeType2 = registration::TypeRegister < ::tree::RankedTreeWrapper, ::tree::PostfixRankedTree < > > ( );
 auto postfixRankedTreeType3 = registration::TypeRegister < alib::Object, ::tree::PostfixRankedTree < > > ( );
 
-auto PostfixRankedTreeFromRankedTree = castApi::CastRegister < ::tree::PostfixRankedTree < >, ::tree::RankedTree < > > ( );
-auto PostfixRankedTreeCastBinder = castApi::CastPoolStringBinder < ::tree::PostfixRankedTree < > > ( ::tree::PostfixRankedTree < >::getXmlTagName ( ) );
+auto PostfixRankedTreeFromRankedTree = registration::CastRegister < ::tree::PostfixRankedTree < >, ::tree::RankedTree < > > ( );
+
+auto PostfixRankedTreeName = registration::NameRegister < ::tree::PostfixRankedTree < > > ( ::tree::PostfixRankedTree < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp
index 2eb97c178b..598c95cc32 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp
@@ -10,7 +10,8 @@
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
@@ -18,11 +19,12 @@ auto prefixRankedBarNonlinearPatternType = registration::TypeRegister < ::tree::
 auto prefixRankedBarNonlinearPatternType2 = registration::TypeRegister < ::tree::RankedTreeWrapper, ::tree::PrefixRankedBarNonlinearPattern < > > ( );
 auto prefixRankedBarNonlinearPatternType3 = registration::TypeRegister < alib::Object, ::tree::PrefixRankedBarNonlinearPattern < > > ( );
 
-auto PrefixRankedBarNonlinearPatternFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedTree < > > ( );
-auto PrefixRankedBarNonlinearPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedPattern < > > ( );
-auto PrefixRankedBarNonlinearPatternFromRankedNonlinearPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedNonlinearPattern < > > ( );
-auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarTree = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::PrefixRankedBarTree < > > ( );
-auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::PrefixRankedBarPattern < > > ( );
-auto PrefixRankedBarNonlinearPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedBarNonlinearPattern < > > ( ::tree::PrefixRankedBarNonlinearPattern < >::getXmlTagName ( ) );
+auto PrefixRankedBarNonlinearPatternFromRankedTree = registration::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedTree < > > ( );
+auto PrefixRankedBarNonlinearPatternFromRankedPattern = registration::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedPattern < > > ( );
+auto PrefixRankedBarNonlinearPatternFromRankedNonlinearPattern = registration::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedNonlinearPattern < > > ( );
+auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarTree = registration::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::PrefixRankedBarTree < > > ( );
+auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarPattern = registration::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::PrefixRankedBarPattern < > > ( );
+
+auto PrefixRankedBarNonlinearPatternName = registration::NameRegister < ::tree::PrefixRankedBarNonlinearPattern < > > ( ::tree::PrefixRankedBarNonlinearPattern < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
index 02709d7a91..0a11dc5638 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
@@ -10,7 +10,8 @@
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
@@ -18,8 +19,9 @@ auto prefixRankedBarPatternType = registration::TypeRegister < ::tree::Tree, ::t
 auto prefixRankedBarPatternType2 = registration::TypeRegister < ::tree::RankedTreeWrapper, ::tree::PrefixRankedBarPattern < > > ( );
 auto prefixRankedBarPatternType3 = registration::TypeRegister < alib::Object, ::tree::PrefixRankedBarPattern < > > ( );
 
-auto PrefixRankedBarPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedBarPattern < >, ::tree::RankedPattern < > > ( );
-auto PrefixRankedBarPatternFromPrefixRankedBarTree = castApi::CastRegister < ::tree::PrefixRankedBarPattern < >, ::tree::PrefixRankedBarTree < > > ( );
-auto PrefixRankedBarPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedBarPattern < > > ( ::tree::PrefixRankedBarPattern < >::getXmlTagName() );
+auto PrefixRankedBarPatternFromRankedPattern = registration::CastRegister < ::tree::PrefixRankedBarPattern < >, ::tree::RankedPattern < > > ( );
+auto PrefixRankedBarPatternFromPrefixRankedBarTree = registration::CastRegister < ::tree::PrefixRankedBarPattern < >, ::tree::PrefixRankedBarTree < > > ( );
+
+auto PrefixRankedBarPatternName = registration::NameRegister < ::tree::PrefixRankedBarPattern < > > ( ::tree::PrefixRankedBarPattern < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
index ca194a4270..2e23881bcb 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
@@ -10,7 +10,8 @@
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
@@ -18,7 +19,8 @@ auto prefixRankedBarTreeType = registration::TypeRegister < ::tree::Tree, ::tree
 auto prefixRankedBarTreeType2 = registration::TypeRegister < ::tree::RankedTreeWrapper, ::tree::PrefixRankedBarTree < > > ( );
 auto prefixRankedBarTreeType3 = registration::TypeRegister < alib::Object, ::tree::PrefixRankedBarTree < > > ( );
 
-auto PrefixRankedBarTreeFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedBarTree < >, ::tree::RankedTree < > > ( );
-auto PrefixRankedBarTreeCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedBarTree < > > ( ::tree::PrefixRankedBarTree < >::getXmlTagName() );
+auto PrefixRankedBarTreeFromRankedTree = registration::CastRegister < ::tree::PrefixRankedBarTree < >, ::tree::RankedTree < > > ( );
+
+auto PrefixRankedBarTreeName = registration::NameRegister < ::tree::PrefixRankedBarTree < > > ( ::tree::PrefixRankedBarTree < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp
index b4b2ef800f..ffb962b5b5 100644
--- a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp
@@ -10,7 +10,8 @@
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
@@ -18,11 +19,12 @@ auto prefixRankedNonlinearPatternType = registration::TypeRegister < ::tree::Tre
 auto prefixRankedNonlinearPatternType2 = registration::TypeRegister < ::tree::RankedTreeWrapper, ::tree::PrefixRankedNonlinearPattern < > > ( );
 auto prefixRankedNonlinearPatternType3 = registration::TypeRegister < alib::Object, ::tree::PrefixRankedNonlinearPattern < > > ( );
 
-auto PrefixRankedNonlinearPatternFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedTree < > > ( );
-auto PrefixRankedNonlinearPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedPattern < > > ( );
-auto PrefixRankedNonlinearPatternFromRankedNonlinearPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedNonlinearPattern < > > ( );
-auto PrefixRankedNonlinearPatternFromPrefixRankedTree = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::PrefixRankedTree < > > ( );
-auto PrefixRankedNonlinearPatternFromPrefixRankedPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::PrefixRankedPattern < > > ( );
-auto PrefixRankedNonlinearPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedNonlinearPattern < > > ( ::tree::PrefixRankedNonlinearPattern < >::getXmlTagName ( ) );
+auto PrefixRankedNonlinearPatternFromRankedTree = registration::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedTree < > > ( );
+auto PrefixRankedNonlinearPatternFromRankedPattern = registration::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedPattern < > > ( );
+auto PrefixRankedNonlinearPatternFromRankedNonlinearPattern = registration::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedNonlinearPattern < > > ( );
+auto PrefixRankedNonlinearPatternFromPrefixRankedTree = registration::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::PrefixRankedTree < > > ( );
+auto PrefixRankedNonlinearPatternFromPrefixRankedPattern = registration::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::PrefixRankedPattern < > > ( );
+
+auto PrefixRankedNonlinearPatternName = registration::NameRegister < ::tree::PrefixRankedNonlinearPattern < > > ( ::tree::PrefixRankedNonlinearPattern < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
index f1a913c09b..115751741c 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
@@ -10,7 +10,8 @@
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
@@ -18,8 +19,9 @@ auto prefixRankedPatternType = registration::TypeRegister < ::tree::Tree, ::tree
 auto prefixRankedPatternType2 = registration::TypeRegister < ::tree::RankedTreeWrapper, ::tree::PrefixRankedPattern < > > ( );
 auto prefixRankedPatternType3 = registration::TypeRegister < alib::Object, ::tree::PrefixRankedPattern < > > ( );
 
-auto PrefixRankedPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedPattern < >, ::tree::RankedPattern < > > ( );
-auto PrefixRankedPatternFromPrefixRankedTree = castApi::CastRegister < ::tree::PrefixRankedPattern < >, ::tree::PrefixRankedTree < > > ( );
-auto PrefixRankedPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedPattern < > > ( ::tree::PrefixRankedPattern < >::getXmlTagName() );
+auto PrefixRankedPatternFromRankedPattern = registration::CastRegister < ::tree::PrefixRankedPattern < >, ::tree::RankedPattern < > > ( );
+auto PrefixRankedPatternFromPrefixRankedTree = registration::CastRegister < ::tree::PrefixRankedPattern < >, ::tree::PrefixRankedTree < > > ( );
+
+auto PrefixRankedPatternName = registration::NameRegister < ::tree::PrefixRankedPattern < > > ( ::tree::PrefixRankedPattern < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.cpp b/alib2data/src/tree/ranked/PrefixRankedTree.cpp
index 2baa29fe68..9b04ab35ab 100644
--- a/alib2data/src/tree/ranked/PrefixRankedTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedTree.cpp
@@ -10,7 +10,8 @@
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
@@ -18,7 +19,8 @@ auto prefixRankedTreeType = registration::TypeRegister < ::tree::Tree, ::tree::P
 auto prefixRankedTreeType2 = registration::TypeRegister < ::tree::RankedTreeWrapper, ::tree::PrefixRankedTree < > > ( );
 auto prefixRankedTreeType3 = registration::TypeRegister < alib::Object, ::tree::PrefixRankedTree < > > ( );
 
-auto PrefixRankedTreeFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedTree < > , ::tree::RankedTree < > > ( );
-auto PrefixRankedTreeCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedTree < > > ( ::tree::PrefixRankedTree < >::getXmlTagName() );
+auto PrefixRankedTreeFromRankedTree = registration::CastRegister < ::tree::PrefixRankedTree < > , ::tree::RankedTree < > > ( );
+
+auto PrefixRankedTreeName = registration::NameRegister < ::tree::PrefixRankedTree < > > ( ::tree::PrefixRankedTree < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
index ba11e59d4c..b58961061b 100644
--- a/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
+++ b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
@@ -10,7 +10,6 @@
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
 
 namespace alib {
 
diff --git a/alib2data/src/tree/ranked/RankedPattern.cpp b/alib2data/src/tree/ranked/RankedPattern.cpp
index 6b616e5365..52e03811a4 100644
--- a/alib2data/src/tree/ranked/RankedPattern.cpp
+++ b/alib2data/src/tree/ranked/RankedPattern.cpp
@@ -10,7 +10,8 @@
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
@@ -18,7 +19,8 @@ auto rankedPatternType = registration::TypeRegister < ::tree::Tree, ::tree::Rank
 auto rankedPatternType2 = registration::TypeRegister < ::tree::RankedTreeWrapper, ::tree::RankedPattern < > > ( );
 auto rankedPatternType3 = registration::TypeRegister < alib::Object, ::tree::RankedPattern < > > ( );
 
-auto RankedPatternFromUnrankedPattern = castApi::CastRegister < ::tree::RankedPattern < >, ::tree::UnrankedPattern < > > ( );
-auto RankedPatternCastBinder = castApi::CastPoolStringBinder < ::tree::RankedPattern < > > ( ::tree::RankedPattern < >::getXmlTagName() );
+auto RankedPatternFromUnrankedPattern = registration::CastRegister < ::tree::RankedPattern < >, ::tree::UnrankedPattern < > > ( );
+
+auto RankedPatternName = registration::NameRegister < ::tree::RankedPattern < > > ( ::tree::RankedPattern < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/ranked/RankedTree.cpp b/alib2data/src/tree/ranked/RankedTree.cpp
index 7898070f5a..7e64bd73d1 100644
--- a/alib2data/src/tree/ranked/RankedTree.cpp
+++ b/alib2data/src/tree/ranked/RankedTree.cpp
@@ -10,7 +10,8 @@
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
@@ -18,8 +19,9 @@ auto rankedTreeType = registration::TypeRegister < ::tree::Tree, ::tree::RankedT
 auto rankedTreeType2 = registration::TypeRegister < ::tree::RankedTreeWrapper, ::tree::RankedTree < > > ( );
 auto rankedTreeType3 = registration::TypeRegister < alib::Object, ::tree::RankedTree < > > ( );
 
-auto RankedTreeFromUnrankedTree = castApi::CastRegister < ::tree::RankedTree < >, ::tree::UnrankedTree < > > ( );
-auto RankedTreeFromPostfixRankedTree = castApi::CastRegister < ::tree::RankedTree < >, ::tree::PostfixRankedTree < > > ( );
-auto RankedTreeCastBinder = castApi::CastPoolStringBinder < ::tree::RankedTree < > > ( ::tree::RankedTree < >::getXmlTagName() );
+auto RankedTreeFromUnrankedTree = registration::CastRegister < ::tree::RankedTree < >, ::tree::UnrankedTree < > > ( );
+auto RankedTreeFromPostfixRankedTree = registration::CastRegister < ::tree::RankedTree < >, ::tree::PostfixRankedTree < > > ( );
+
+auto RankedTreeName = registration::NameRegister < ::tree::RankedTree < > > ( ::tree::RankedTree < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/unranked/PrefixBarTree.cpp b/alib2data/src/tree/unranked/PrefixBarTree.cpp
index 9d4eb3b812..81203f614d 100644
--- a/alib2data/src/tree/unranked/PrefixBarTree.cpp
+++ b/alib2data/src/tree/unranked/PrefixBarTree.cpp
@@ -10,15 +10,17 @@
 #include "../UnrankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
-auto prefixBarTreeType = registration::TypeRegister < tree::Tree, tree::PrefixBarTree < > > ( );
-auto prefixBarTreeType2 = registration::TypeRegister < tree::UnrankedTreeWrapper, tree::PrefixBarTree < > > ( );
-auto prefixBarTreeType3 = registration::TypeRegister < alib::Object, tree::PrefixBarTree < > > ( );
+auto prefixBarTreeType = registration::TypeRegister < ::tree::Tree, ::tree::PrefixBarTree < > > ( );
+auto prefixBarTreeType2 = registration::TypeRegister < ::tree::UnrankedTreeWrapper, ::tree::PrefixBarTree < > > ( );
+auto prefixBarTreeType3 = registration::TypeRegister < alib::Object, ::tree::PrefixBarTree < > > ( );
 
-auto PrefixBarTreeFromUnrankedTree = castApi::CastRegister < tree::PrefixBarTree < > , tree::UnrankedTree < > > ( );
-auto PrefixBarTreeCastBinder = castApi::CastPoolStringBinder < tree::PrefixBarTree < > > ( tree::PrefixBarTree < >::getXmlTagName() );
+auto PrefixBarTreeFromUnrankedTree = registration::CastRegister < ::tree::PrefixBarTree < >, ::tree::UnrankedTree < > > ( );
+
+auto PrefixBarTreeName = registration::NameRegister < ::tree::PrefixBarTree < > > ( ::tree::PrefixBarTree < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
index 7aa205bae6..eb7aaa04b5 100644
--- a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
+++ b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
@@ -10,7 +10,6 @@
 #include "../UnrankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
 
 namespace alib {
 
diff --git a/alib2data/src/tree/unranked/UnrankedPattern.cpp b/alib2data/src/tree/unranked/UnrankedPattern.cpp
index a6d32a2915..b100cff9d6 100644
--- a/alib2data/src/tree/unranked/UnrankedPattern.cpp
+++ b/alib2data/src/tree/unranked/UnrankedPattern.cpp
@@ -10,7 +10,8 @@
 #include "../UnrankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
@@ -18,7 +19,8 @@ auto unrankedPatternType = registration::TypeRegister < ::tree::Tree, ::tree::Un
 auto unrankedPatternType2 = registration::TypeRegister < ::tree::UnrankedTreeWrapper, ::tree::UnrankedPattern < > > ( );
 auto unrankedPatternType3 = registration::TypeRegister < alib::Object, ::tree::UnrankedPattern < > > ( );
 
-auto UnrankedPatternFromRankedPattern = castApi::CastRegister < ::tree::UnrankedPattern < >, ::tree::RankedPattern < > > ( );
-auto UnrankedPatternCastBinder = castApi::CastPoolStringBinder < ::tree::UnrankedPattern < > > ( ::tree::UnrankedPattern < >::getXmlTagName() );
+auto UnrankedPatternFromRankedPattern = registration::CastRegister < ::tree::UnrankedPattern < >, ::tree::RankedPattern < > > ( );
+
+auto UnrankedPatternName = registration::NameRegister < ::tree::UnrankedPattern < > > ( ::tree::UnrankedPattern < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/unranked/UnrankedTree.cpp b/alib2data/src/tree/unranked/UnrankedTree.cpp
index ae2172109a..ea29eaadbe 100644
--- a/alib2data/src/tree/unranked/UnrankedTree.cpp
+++ b/alib2data/src/tree/unranked/UnrankedTree.cpp
@@ -10,7 +10,8 @@
 #include "../UnrankedTreeWrapper.h"
 #include <object/Object.h>
 #include <registration/TypeRegistration.hpp>
-#include <core/castApi.hpp>
+#include <registration/CastRegistration.hpp>
+#include <registration/NameRegistration.hpp>
 
 namespace alib {
 
@@ -18,7 +19,8 @@ auto unrankedTreeType = registration::TypeRegister < ::tree::Tree, ::tree::Unran
 auto unrankedTreeType2 = registration::TypeRegister < ::tree::UnrankedTreeWrapper, ::tree::UnrankedTree < > > ( );
 auto unrankedTreeType3 = registration::TypeRegister < alib::Object, ::tree::UnrankedTree < > > ( );
 
-auto UnrankedTreeFromRankedTree = castApi::CastRegister < ::tree::UnrankedTree < >, ::tree::RankedTree < > > ( );
-auto UnrankedTreeCastBinder = castApi::CastPoolStringBinder < ::tree::UnrankedTree < > > ( ::tree::UnrankedTree < >::getXmlTagName() );
+auto UnrankedTreeFromRankedTree = registration::CastRegister < ::tree::UnrankedTree < >, ::tree::RankedTree < > > ( );
+
+auto UnrankedTreeName = registration::NameRegister < ::tree::UnrankedTree < > > ( ::tree::UnrankedTree < >::getXmlTagName ( ) );
 
 } /* namespace alib */
-- 
GitLab