1414# include < boost/python/type_id.hpp>
1515# include < boost/python/detail/wrap_function.hpp>
1616# include < boost/python/detail/member_function_cast.hpp>
17+ # include < boost/python/detail/module_base.hpp>
1718# include < boost/python/object/class_converters.hpp>
1819# include < boost/type_traits/ice.hpp>
1920# include < boost/type_traits/same_traits.hpp>
@@ -86,12 +87,12 @@ class class_ : public objects::class_base
8687 public:
8788 // Automatically derive the class name - only works on some
8889 // compilers because type_info::name is sometimes mangled (gcc)
89- class_ ();
90+ class_ (base const & parent_class = empty_class_base() );
9091
9192 // Construct with the class name. [ Would have used a default
9293 // argument but gcc-2.95.2 choked on typeid(T).name() as a default
9394 // parameter value]
94- class_ (char const * name);
95+ class_ (char const * name, base const & parent_class = empty_class_base() );
9596
9697
9798 // Wrap a member function or a non-member function which can take
@@ -195,6 +196,22 @@ class class_ : public objects::class_base
195196
196197 self& setattr (char const * name, handle<> const &);
197198
199+ // add to module
200+ self& add (module &m)
201+ {
202+ // redundant
203+ // m.add(*this);
204+ return *this ;
205+ }
206+
207+ // add to current module
208+ self& add ()
209+ {
210+ // redundant
211+ // boost::python::add(*this);
212+ return *this ;
213+ }
214+
198215 private: // types
199216 typedef objects::class_id class_id;
200217
@@ -231,7 +248,7 @@ class class_ : public objects::class_base
231248// implementations
232249//
233250template <class T , class X1 , class X2 , class X3 >
234- inline class_<T,X1,X2,X3>::class_()
251+ inline class_<T,X1,X2,X3>::class_(base const & parent_class )
235252 : base(typeid (T).name(), id_vector::size, id_vector().ids)
236253{
237254 // register converters
@@ -241,10 +258,16 @@ inline class_<T,X1,X2,X3>::class_()
241258 mpl::bool_t <is_copyable>()
242259 , objects::select_holder<T,held_type>((held_type*)0 ).get ()
243260 , this ->object ());
261+
262+ // get the context to add the class to
263+ handle<> parent (parent_class.object () ? handle<>(parent_class.object ()) :
264+ base::get_class_context_object (typeid (T).name (), object ()));
265+ // add the class to the current module
266+ boost::python::detail::module_base::add (object (), parent);
244267}
245268
246269template <class T , class X1 , class X2 , class X3 >
247- inline class_<T,X1,X2,X3>::class_(char const * name)
270+ inline class_<T,X1,X2,X3>::class_(char const * name, base const & parent_class )
248271 : base(name, id_vector::size, id_vector().ids)
249272{
250273 // register converters
@@ -254,8 +277,13 @@ inline class_<T,X1,X2,X3>::class_(char const* name)
254277 mpl::bool_t <is_copyable>()
255278 , objects::select_holder<T,held_type>((held_type*)0 ).get ()
256279 , this ->object ());
257- }
258280
281+ // get the context to add the class to
282+ handle<> parent (parent_class.object () ? handle<>(parent_class.object ()) :
283+ base::get_class_context_object (name, object ()));
284+ // add the class to the current module
285+ boost::python::detail::module_base::add (object (), parent);
286+ }
259287
260288template <class T , class X1 , class X2 , class X3 >
261289inline class_<T,X1,X2,X3>& class_<T,X1,X2,X3>::add_property(char const * name, handle<> const & fget)
0 commit comments