Index: /trunk/boost/python/object_core.hpp =================================================================== --- /trunk/boost/python/object_core.hpp (revision 45918) +++ /trunk/boost/python/object_core.hpp (revision 47846) @@ -42,4 +42,10 @@ namespace boost { namespace python { + +namespace detail +{ + class kwds_proxy; + class args_proxy; +} namespace converter @@ -103,4 +109,9 @@ # define BOOST_PP_ITERATION_PARAMS_1 (3, (1, BOOST_PYTHON_MAX_ARITY, )) # include BOOST_PP_ITERATE() + + detail::args_proxy operator* () const; + object operator()(detail::args_proxy const &args) const; + object operator()(detail::args_proxy const &args, + detail::kwds_proxy const &kwds) const; // truth value testing @@ -417,4 +428,60 @@ // +namespace detail +{ + +class call_proxy +{ +public: + call_proxy(object target) : m_target(target) {} + operator object() const { return m_target;} + + private: + object m_target; +}; + +class kwds_proxy : public call_proxy +{ +public: + kwds_proxy(object o = object()) : call_proxy(o) {} +}; +class args_proxy : public call_proxy +{ +public: + args_proxy(object o) : call_proxy(o) {} + kwds_proxy operator* () const { return kwds_proxy(*this);} +}; +} + +template +detail::args_proxy api::object_operators::operator* () const +{ + object_cref2 x = *static_cast(this); + return detail::args_proxy(x); +} + +template +object api::object_operators::operator()(detail::args_proxy const &args) const +{ + U const& self = *static_cast(this); + PyObject *result = PyObject_Call(get_managed_object(self, tag), + args.operator object().ptr(), + 0); + return object(detail::new_reference(result)); + +} + +template +object api::object_operators::operator()(detail::args_proxy const &args, + detail::kwds_proxy const &kwds) const +{ + U const& self = *static_cast(this); + PyObject *result = PyObject_Call(get_managed_object(self, tag), + args.operator object().ptr(), + kwds.operator object().ptr()); + return object(detail::new_reference(result)); + +} + inline object::object() : object_base(python::incref(Py_None)) Index: /trunk/libs/python/test/object.cpp =================================================================== --- /trunk/libs/python/test/object.cpp (revision 45918) +++ /trunk/libs/python/test/object.cpp (revision 47846) @@ -187,4 +187,9 @@ return s.slice(2,-1).slice(1,-1) == "lo, wor"; } + +object test_call(object c, object args, object kwds) +{ + return c(*args, **kwds); +} bool check_binary_operators() @@ -378,4 +383,5 @@ def("test_not_item", test_not_item); + def("test_call", test_call); def("check_binary_operators", check_binary_operators); def("check_inplace", check_inplace); Index: /trunk/libs/python/test/object.py =================================================================== --- /trunk/libs/python/test/object.py (revision 45918) +++ /trunk/libs/python/test/object.py (revision 47846) @@ -135,5 +135,10 @@ Operators - +>>> def print_args(*args, **kwds): +... print args, kwds +>>> test_call(print_args, (0, 1, 2, 3), {'a':'A'}) +(0, 1, 2, 3) {'a': 'A'} + + >>> assert check_binary_operators() Index: /trunk/libs/python/doc/v2/object.html =================================================================== --- /trunk/libs/python/doc/v2/object.html (revision 45918) +++ /trunk/libs/python/doc/v2/object.html (revision 47846) @@ -656,4 +656,9 @@ object operator()(A0 const&, A1 const&,...An const&) const; + detail::args_proxy operator* () const; + object operator()(detail::args_proxy const &args) const; + object operator()(detail::args_proxy const &args, + detail::kwds_proxy const &kwds) const; + // truth value testing // @@ -705,4 +710,23 @@ a2,...aN) + +
+object operator()(detail::args_proxy const &args) const; 
+
+
+
Effects: + call object with arguments given by the tuple args
+
+
+object operator()(detail::args_proxy const &args, 
+                  detail::kwds_proxy const &kwds) const; 
+
+
+
Effects: + call object with arguments given by the tuple args, and named + arguments given by the dictionary kwds
+
+ +
 operator bool_type() const;