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