diff --git a/dispatchkit/dispatchkit.hpp b/dispatchkit/dispatchkit.hpp index a4ebfa6..735e23e 100644 --- a/dispatchkit/dispatchkit.hpp +++ b/dispatchkit/dispatchkit.hpp @@ -18,6 +18,36 @@ namespace dispatchkit { + class Dispatch_Function : public Proxy_Function + { + public: + Dispatch_Function(const std::vector > > &t_funcs) + : m_funcs(t_funcs) + { + } + + bool operator==(const Proxy_Function &f) const + { + return false; + } + + virtual ~Dispatch_Function() {} + + virtual Boxed_Value operator()(const std::vector ¶ms) + { + return dispatch(m_funcs, params); + } + + virtual std::vector get_param_types() + { + return std::vector(); + } + + private: + std::vector > > m_funcs; + }; + + class Dispatch_Engine { public: @@ -103,7 +133,14 @@ namespace dispatchkit } } - throw std::range_error("Object not known: " + name); + std::vector > funcs = get_function_impl(name, false); + + if (funcs.empty()) + { + throw std::range_error("Object not known: " + name); + } else { + return Boxed_Value(boost::shared_ptr(new Dispatch_Function(funcs))); + } } template @@ -118,18 +155,21 @@ namespace dispatchkit } std::vector > - get_function(const std::string &t_name) const + get_function_impl(const std::string &t_name, bool include_objects) const { std::vector > funcs; - try { - funcs.insert(funcs.end(), - Function_Map::value_type( - t_name, - boxed_cast(get_object(t_name))) - ); - } catch (const std::bad_cast &) { - } catch (const std::range_error &) { + if (include_objects) + { + try { + funcs.insert(funcs.end(), + Function_Map::value_type( + t_name, + boxed_cast(get_object(t_name))) + ); + } catch (const bad_boxed_cast &) { + } catch (const std::range_error &) { + } } std::pair range @@ -139,6 +179,12 @@ namespace dispatchkit return funcs; } + std::vector > + get_function(const std::string &t_name) const + { + return get_function_impl(t_name, true); + } + std::vector get_functions() const { return std::vector(m_functions.begin(), m_functions.end());