diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index 86a4969..14b4190 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -689,8 +689,10 @@ namespace chaiscript m->add(fun(boost::function(&what)), "what"); m->add(user_type(), "Dynamic_Object"); - copy_constructor("Dynamic_Object", m); - + m->add(constructor(), "Dynamic_Object"); + m->add(fun(&Dynamic_Object::get_type_name), "get_type_name"); + m->add(fun(&Dynamic_Object::get_attrs), "get_attrs"); + m->add(fun(&Dynamic_Object::get_attr), "get_attr"); basic_constructors("bool", m); diff --git a/include/chaiscript/dispatchkit/dynamic_object.hpp b/include/chaiscript/dispatchkit/dynamic_object.hpp index b94e930..97ffdc9 100644 --- a/include/chaiscript/dispatchkit/dynamic_object.hpp +++ b/include/chaiscript/dispatchkit/dynamic_object.hpp @@ -21,6 +21,11 @@ namespace chaiscript return m_attrs[t_attr_name]; } + std::map get_attrs() + { + return m_attrs; + } + private: std::string m_type_name; diff --git a/include/chaiscript/language/chaiscript_prelude.hpp b/include/chaiscript/language/chaiscript_prelude.hpp index f8f8ce4..592820a 100644 --- a/include/chaiscript/language/chaiscript_prelude.hpp +++ b/include/chaiscript/language/chaiscript_prelude.hpp @@ -13,6 +13,7 @@ #define chaiscript_prelude CODE_STRING(\ def new(x) { eval(type_name(x))(); } \n\ +def clone(o) : is_type(o, "Dynamic_Object") { var new_o := Dynamic_Object(o.get_type_name()); for_each(o.get_attrs(), bind(fun(new_o, x) { new_o.get_attr(x.first) = x.second; }, new_o, _) ); return new_o; } \n\ def clone(x) : function_exists(type_name(x)) { eval(type_name(x))(x); } \n\ # to_string for Pair()\n\ def to_string(x) : call_exists(first, x) && call_exists(second, x) { \n\ diff --git a/unittests/object_clone.chai b/unittests/object_clone.chai new file mode 100644 index 0000000..03bd431 --- /dev/null +++ b/unittests/object_clone.chai @@ -0,0 +1,11 @@ +attr bob::z +def bob::bob() { } + +var x = bob(); +x.z = 10; + +var y = clone(x); +y.z = 20; + +print(x.z); +print(y.z); diff --git a/unittests/object_clone.txt b/unittests/object_clone.txt new file mode 100644 index 0000000..3b86147 --- /dev/null +++ b/unittests/object_clone.txt @@ -0,0 +1,2 @@ +10 +20