Package pyplusplus :: Package module_builder :: Module builder |

# Source Code for Module pyplusplus.module_builder.builder

      1  # Copyright 2004-2008 Roman Yakovenko.
      2  # Distributed under the Boost Software License, Version 1.0. (See
      3  # accompanying file LICENSE_1_0.txt or copy at
      4  # http://www.boost.org/LICENSE_1_0.txt)
      5
      6  import os
      7  import sys
      8  import time
      9  import types
     10  import warnings
     11
     12  from pygccxml import parser
     13  from pygccxml import declarations as decls_package
     14
     15  from pyplusplus import utils
     16  from pyplusplus import _logging_
     17  from pyplusplus import decl_wrappers
     18  from pyplusplus import file_writers
     19  from pyplusplus import code_creators
     20  from pyplusplus import module_creator as mcreator_package
     21
     22 -class module_builder_t(object):
     23      """
     24      This class provides users with simple and intuitive interface to Py++
     25      and/or pygccxml functionality. If this is your first attempt to use Py++
     26      consider to read tutorials. You can find them on U{web site<http://www.language-binding.net>}.
     27      """
     28
     29 -    def __init__( self
     30                    , files
     31                    , gccxml_path=''
     32                    , working_directory='.'
     33                    , include_paths=None
     34                    , define_symbols=None
     35                    , undefine_symbols=None
     36                    , start_with_declarations=None
     37                    , compilation_mode=None
     38                    , cache=None
     39                    , optimize_queries=True
     40                    , ignore_gccxml_output=False
     41                    , indexing_suite_version=1
     42                    , cflags=""
     43                    , encoding='ascii'
     44                    , compiler=None):
     45          """
     46          @param files: list of files, declarations from them you want to export
     47          @type files: list of strings or L{file_configuration_t} instances
     48
     49          @param gccxml_path: path to gccxml binary. If you don't pass this argument,
     50          pygccxml parser will try to locate it using you environment PATH variable
     51          @type gccxml_path: str
     52
     53          @param include_paths: additional header files location. You don't have to
     54          specify system and standard directories.
     55          @type include_paths: list of strings
     56
     57          @param define_symbols: list of symbols to be defined for preprocessor.
     58          @param define_symbols: list of strings
     59
     60          @param undefine_symbols: list of symbols to be undefined for preprocessor.
     61          @param undefine_symbols: list of strings
     62
     63          @param cflags: Raw string to be added to gccxml command line.
     64          """
     65          object.__init__( self )
     66          self.logger = _logging_.loggers.module_builder
     67          self.__encoding = encoding
     68          gccxml_config = parser.config_t(
     69              gccxml_path=gccxml_path
     70              , working_directory=working_directory
     71              , include_paths=include_paths
     72              , define_symbols=define_symbols
     73              , undefine_symbols=undefine_symbols
     74              , start_with_declarations=start_with_declarations
     75              , ignore_gccxml_output=ignore_gccxml_output
     76              , cflags=cflags
     77              , compiler=compiler)
     78
     79          #may be in future I will add those directories to user_defined_directories
     80          #to self.__code_creator.
     81          self.__working_dir = os.path.abspath( working_directory )
     82
     83          self.__parsed_files = map( decls_package.filtering.normalize_path
     84                                     , parser.project_reader_t.get_os_file_names( files ) )
     85          tmp = map( lambda file_: os.path.split( file_ )[0], self.__parsed_files )
     86          self.__parsed_dirs = filter( None, tmp )
     87
     88          self.__global_ns = self.__parse_declarations( files
     89                                                        , gccxml_config
     90                                                        , compilation_mode
     91                                                        , cache
     92                                                        , indexing_suite_version)
     93          self.__code_creator = None
     94          if optimize_queries:
     95              self.run_query_optimizer()
     96
     97          self.__declarations_code_head = []
     98          self.__declarations_code_tail = []
     99
    100          self.__registrations_code_head = []
    101          self.__registrations_code_tail = []
    102
    103      @property
    104 -    def global_ns( self ):
    105          """reference to global namespace"""
    106          return self.__global_ns
    107
    108      @property
    109 -    def encoding( self ):
    110          return self.__encoding
    111
    112 -    def register_module_dependency( self, other_module_generated_code_dir ):
    113          """``already_exposed`` solution is pretty good when you mix hand-written
    114          modules with Py++ generated. It doesn't work/scale for "true"
    115          multi-module development. This is exactly the reason why ``Py++``_
    116          offers "semi automatic" solution.
    117
    118          For every exposed module, ``Py++``_ generates "exposed_decl.pypp.txt" file.
    119          This file contains the list of all parsed declarations and whether they
    120          were included or excluded. Later, when you work on another module, you
    121          can tell ``Py++``_ that the current module depends on the previously
    122          generated one. ``Py++``_ will load "exposed_decl.pypp.txt" file and
    123          update the declarations.
    124          """
    125
    126          db = utils.exposed_decls_db_t()
    127          db.load( other_module_generated_code_dir )
    128          db.update_decls( self.global_ns )
    129
    130 -    def run_query_optimizer(self):
    131          """
    132          It is possible to optimze time that takes to execute queries. In most cases
    133          this is done from __init__ method. But there are use-case, when you need
    134          to disable optimizer at __init__ and run it later.
    135          """
    136          self.__global_ns.init_optimizer()
    137
    138 -    def __parse_declarations( self, files, gccxml_config, compilation_mode, cache, indexing_suite_version ):
    139          if None is gccxml_config:
    140              gccxml_config = parser.config_t()
    141          if None is compilation_mode:
    142              compilation_mode = parser.COMPILATION_MODE.FILE_BY_FILE
    143          start_time = time.clock()
    144          self.logger.debug( 'parsing files - started' )
    145          reader = parser.project_reader_t( gccxml_config, cache, decl_wrappers.dwfactory_t() )
    146          decls = reader.read_files( files, compilation_mode )
    147
    148          self.logger.debug( 'parsing files - done( %f seconds )' % ( time.clock() - start_time ) )
    149          self.logger.debug( 'settings declarations defaults - started' )
    150
    151          global_ns = decls_package.matcher.get_single(
    152                  decls_package.namespace_matcher_t( name='::' )
    153                  , decls )
    154          if indexing_suite_version != 1:
    155              for cls in global_ns.classes():
    156                  cls.indexing_suite_version = indexing_suite_version
    157              for cls in global_ns.decls(decl_type=decls_package.class_declaration_t):
    158                  cls.indexing_suite_version = indexing_suite_version
    159
    160          start_time = time.clock()
    161          self.__apply_decls_defaults(decls)
    162          self.logger.debug( 'settings declarations defaults - done( %f seconds )'
    163                             % ( time.clock() - start_time ) )
    164          return global_ns
    165
    166 -    def __filter_by_location( self, flatten_decls ):
    167          for decl in flatten_decls:
    168              if not decl.location:
    169                  continue
    170              fpath = decls_package.filtering.normalize_path( decl.location.file_name )
    171              if decls_package.filtering.contains_parent_dir( fpath, self.__parsed_dirs ):
    172                  continue
    173              if fpath in self.__parsed_files:
    174                  continue
    175              found = False
    176              for pfile in self.__parsed_files:
    177                  if fpath.endswith( pfile ):
    178                      found = True
    179                      break
    180              if not found:
    181                  decl.exclude()
    182
    183 -    def __apply_decls_defaults(self, decls):
    184          flatten_decls = decls_package.make_flatten( decls )
    185          self.__filter_by_location( flatten_decls )
    186          call_policies_resolver = mcreator_package.built_in_resolver_t()
    187          calldefs = filter( lambda decl: isinstance( decl, decls_package.calldef_t )
    188                             , flatten_decls )
    189          map( lambda calldef: calldef.set_call_policies( call_policies_resolver( calldef ) )
    190               , calldefs )
    191          mem_vars = filter( lambda decl: isinstance( decl, decls_package.variable_t )
    192                                          and isinstance( decl.parent, decls_package.class_t )
    193                             , flatten_decls )
    194          map( lambda mem_var: mem_var.set_getter_call_policies( call_policies_resolver( mem_var, 'get' ) )
    195               , mem_vars )
    196          map( lambda mem_var: mem_var.set_setter_call_policies( call_policies_resolver( mem_var, 'set' ) )
    197               , mem_vars )
    198
    199      @property
    200 -    def declarations_code_head( self ):
    201          "List of user code, that will be added to the head of the declarations section."
    202          return self.__declarations_code_head
    203
    204      @property
    205 -    def declarations_code_tail( self ):
    206          "List of user code, that will be added to the tail of the declarations section."
    207          return self.__declarations_code_tail
    208
    209      @property
    210 -    def registrations_code_head( self ):
    211          "List of user code, that will be added to the head of the registrations section."
    212          return self.__registrations_code_head
    213
    214      @property
    215 -    def registrations_code_tail( self ):
    216          "List of user code, that will be added to the tail of the registrations section."
    217          return self.__registrations_code_tail
    218
    219 -    def print_declarations(self, decl=None, detailed=True, recursive=True, writer=sys.stdout.write):
    220          """
    221          This function will print detailed description of all declarations or
    222          some specific one.
    223
    224          @param decl: optional, if passed, then only it will be printed
    225          @type decl: instance of L{decl_wrappers.decl_wrapper_t} class
    226          """
    227          if None is decl:
    228              decl = self.global_ns
    229          decl_wrappers.print_declarations( decl, detailed, recursive, writer )
    230
    231 -    def build_code_creator( self
    232                         , module_name
    233                         , boost_python_ns_name='bp'
    234                         , create_casting_constructor=True
    235                         , call_policies_resolver_=None
    236                         , types_db=None
    237                         , target_configuration=None
    238                         , enable_indexing_suite=True
    239                         , doc_extractor=None):
    240          """
    241          Creates L{module_t} code creator.
    242
    243          @param module_name: module name
    244          @type module_name: string
    245
    246          @param boost_python_ns_name: boost::python namespace alias, by default
    247          it is 'bp'
    248          @type boost_python_ns_name: string
    249
    250          @param call_policies_resolver_: callable, that will be invoked on every
    251          calldef object. It should return call policies.
    252          @type call_policies_resolver_: callable
    253          @param doc_extractor: callable, that takes as argument reference to declaration
    254              and returns documentation string
    255          @type doc_extractor: callable or None
    256          """
    257          if not create_casting_constructor:
    258              msg = os.linesep.join([
    259                        "create_casting_constructor argument is deprecated."
    260                      , "If want to disable boost::python::implicitly_convertible code generation, consider to use allow_implicit_conversion constructor property"
    261                      , ">>> mb = module_builder_t(...)"
    262                      , ">>> mb.constructors().allow_implicit_conversion = False"])
    263              warnings.warn(msg, DeprecationWarning, stacklevel=2)
    264
    265              self.global_ns.constructors(allow_empty=True).allow_implicit_conversion = False
    266
    267          creator = mcreator_package.creator_t( self.global_ns
    268                                                , module_name
    269                                                , boost_python_ns_name
    270                                                , call_policies_resolver_
    271                                                , types_db
    272                                                , target_configuration
    273                                                , enable_indexing_suite
    274                                                , doc_extractor)
    275          self.__code_creator = creator.create()
    276          self.__code_creator.replace_included_headers(self.__parsed_files)
    277          #I think I should ask users, what they expect
    278          #self.__code_creator.user_defined_directories.append( self.__working_dir )
    279          #map( self.__code_creator.user_defined_directories.append
    280          #     , self.__parsed_dirs )
    281
    282          return self.__code_creator
    283
    284      @property
    285 -    def code_creator( self ):
    286          "reference to L{code_creators.module_t} instance"
    287          if not self.__code_creator:
    288              raise RuntimeError( "self.module is equal to None. Did you forget to call build_code_creator function?" )
    289          return self.__code_creator
    290
    291 -    def has_code_creator( self ):
    292          """
    293          Function, that will return True if build_code_creator function has been
    294          called and False otherwise
    295          """
    296          return not ( None is self.__code_creator )
    297
    298 -    def add_declaration_code( self, code, tail=True ):
    299          if tail:
    300              self.__declarations_code_tail.append( code )
    301          else:
    302              self.__declarations_code_head.append( code )
    303
    304 -    def add_registration_code( self, code, tail=True ):
    305          if tail:
    306              self.__registrations_code_tail.append( code )
    307          else:
    308              self.__registrations_code_head.append( code )
    309
    310 -    def add_constants( self, **keywds ):
    311          """adds code that exposes some constants to Python.
    312
    313          For example:
    314              mb.add_constants( version='"1.2.3"' )
    315          or
    316              mb.add_constants( **{ version:'"1.2.3"' } )
    317          will generate next code:
    318              boost::python::scope().attr("version") = "1.2.3";
    319          """
    320          tmpl = 'boost::python::scope().attr("%(name)s") = %(value)s;'
    321          for name, value in keywds.items():
    322              if not isinstance( value, types.StringTypes ):
    323                  value = str( value )
    324              self.add_registration_code( tmpl % dict( name=name, value=value) )
    325
    326
    327 -    def __merge_user_code( self ):
    328          for code in self.__declarations_code_tail:
    329              self.code_creator.add_declaration_code( code, -1 )
    330
    331          for code in self.__declarations_code_head:
    332              self.code_creator.add_declaration_code( code, 0 )
    333
    334          body = self.code_creator.body
    335
    336          for code in self.__registrations_code_tail:
    337              body.adopt_creator( code_creators.custom_text_t( code ), -1 )
    338
    339          for code in self.__registrations_code_head:
    340              body.adopt_creator( code_creators.custom_text_t( code ), 0 )
    341
    342
    343 -    def write_module( self, file_name ):
    344          """
    345          Writes module to single file
    346          @param file_name: file name
    347          @type file_name: string
    348          """
    349          self.__merge_user_code()
    350          file_writers.write_file( self.code_creator, file_name, encoding=self.encoding )
    351
    352 -    def __work_on_unused_files( self, dir_name, written_files, on_unused_file_found ):
    353          all_files = os.listdir( dir_name )
    354          all_files = map( lambda fname: os.path.join( dir_name, fname ), all_files )
    355          all_files = filter( file_writers.has_pypp_extenstion, all_files )
    356
    357          unused_files = set( all_files ).difference( set( written_files ) )
    358          for fpath in unused_files:
    359              try:
    360                  if on_unused_file_found is os.remove:
    361                      self.logger.info( 'removing file "%s"' % fpath )
    362                  on_unused_file_found( fpath )
    363              except Exception, error:
    364                  self.logger.exception( "Exception was catched, while executing 'on_unused_file_found' function."  )
    365
    366 -    def split_module( self
    367                        , dir_name
    368                        , huge_classes=None
    369                        , on_unused_file_found=os.remove
    370                        , use_files_sum_repository=False):
    371          """
    372          Writes module to multiple files
    373
    374          @param dir_name: directory name
    375          @type dir_name: string
    376
    377          @param huge_classes: list that contains reference to classes, that should be split
    378
    379          @param on_unused_file_found: callable object that represents the action that should be taken on
    380                                       file, which is no more in use
    381
    382          @use_files_sum_repository: Py++ can generate file, which will contain md5 sum of every generated file.
    383                                     Next time you generate code, md5sum will be loaded from the file and compared.
    384                                     This could speed-up code generation process by 10-15%.
    385          """
    386          self.__merge_user_code()
    387
    388          files_sum_repository = None
    389          if use_files_sum_repository:
    390              cache_file = os.path.join( dir_name, self.code_creator.body.name + '.md5.sum' )
    391              files_sum_repository = file_writers.cached_repository_t( cache_file )
    392
    393          written_files = []
    394          if None is huge_classes:
    395              written_files = file_writers.write_multiple_files(
    396                                  self.code_creator
    397                                  , dir_name
    398                                  , files_sum_repository=files_sum_repository
    399                                  , encoding=self.encoding)
    400          else:
    401              written_files = file_writers.write_class_multiple_files(
    402                                  self.code_creator
    403                                  , dir_name
    404                                  , huge_classes
    405                                  , files_sum_repository=files_sum_repository
    406                                  , encoding=self.encoding)
    407          self.__work_on_unused_files( dir_name, written_files, on_unused_file_found )
    408
    409          return written_files
    410
    411 -    def balanced_split_module( self
    412                                 , dir_name
    413                                 , number_of_files
    414                                 , on_unused_file_found=os.remove
    415                                 , use_files_sum_repository=False):
    416          """
    417          Writes module to fixed number of multiple cpp files
    418
    419          @param number_of_files: the desired number of generated cpp files
    420          @type number_of_files: int
    421
    422          @param dir_name: directory name
    423          @type dir_name: string
    424
    425          @param on_unused_file_found: callable object that represents the action that should be taken on
    426                                       file, which is no more in use
    427
    428          @use_files_sum_repository: Py++ can generate file, which will contain md5 sum of every generated file.
    429                                     Next time you generate code, md5sum will be loaded from the file and compared.
    430                                     This could speed-up code generation process by 10-15%.
    431          """
    432          self.__merge_user_code()
    433
    434          files_sum_repository = None
    435          if use_files_sum_repository:
    436              cache_file = os.path.join( dir_name, self.code_creator.body.name + '.md5.sum' )
    437              files_sum_repository = file_writers.cached_repository_t( cache_file )
    438
    439          written_files = file_writers.write_balanced_files( self.code_creator
    440                                                             , dir_name
    441                                                             , number_of_buckets=number_of_files
    442                                                             , files_sum_repository=files_sum_repository
    443                                                             , encoding=self.encoding)
    444
    445          self.__work_on_unused_files( dir_name, written_files, on_unused_file_found )
    446
    447          return written_files
    448
    449
    450      #select decl(s) interfaces
    451 -    def decl( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
    452          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    453          return self.global_ns.decl( name=name
    454                                      , function=function
    455                                      , header_dir=header_dir
    456                                      , header_file=header_file
    457                                      , recursive=recursive)
    458
    459 -    def decls( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
    460          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    461          return self.global_ns.decls( name=name
    462                                       , function=function
    463                                       , header_dir=header_dir
    464                                       , header_file=header_file
    465                                       , recursive=recursive)
    466
    467 -    def class_( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
    468          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    469          return self.global_ns.class_( name=name
    470                                        , function=function
    471                                        , header_dir=header_dir
    472                                        , header_file=header_file
    473                                        , recursive=recursive)
    474
    475 -    def classes( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
    476          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    477          return self.global_ns.classes( name=name
    478                                         , function=function
    479                                         , header_dir=header_dir
    480                                         , header_file=header_file
    481                                         , recursive=recursive)
    482
    483 -    def variable( self, name=None, function=None, type=None, header_dir=None, header_file=None, recursive=None ):
    484          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    485          return self.global_ns.variable( name=name
    486                                          , function=function
    487                                          , type=type
    488                                          , header_dir=header_dir
    489                                          , header_file=header_file
    490                                          , recursive=recursive)
    491      var = variable
    492
    493 -    def variables( self, name=None, function=None, type=None, header_dir=None, header_file=None, recursive=None ):
    494          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    495          return self.global_ns.variables( name=name
    496                                           , function=function
    497                                           , type=type
    498                                           , header_dir=header_dir
    499                                           , header_file=header_file
    500                                           , recursive=recursive)
    501      vars = variables
    502
    503 -    def calldef( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    504          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    505          return self.global_ns.calldef( name=name
    506                                         , function=function
    507                                         , return_type=return_type
    508                                         , arg_types=arg_types
    509                                         , header_dir=header_dir
    510                                         , header_file=header_file
    511                                         , recursive=recursive )
    512
    513 -    def calldefs( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    514          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    515          return self.global_ns.calldefs( name=name
    516                                          , function=function
    517                                          , return_type=return_type
    518                                          , arg_types=arg_types
    519                                          , header_dir=header_dir
    520                                          , header_file=header_file
    521                                          , recursive=recursive)
    522
    523 -    def operator( self, name=None, symbol=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None, recursive=None ):
    524          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    525          return self.global_ns.operator( name=name
    526                                          , symbol=symbol
    527                                          , decl_type=decl_type
    528                                          , return_type=return_type
    529                                          , arg_types=arg_types
    530                                          , header_dir=header_dir
    531                                          , header_file=header_file
    532                                          , recursive=recursive )
    533
    534 -    def operators( self, name=None, symbol=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None, recursive=None ):
    535          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    536          return self.global_ns.operators( name=name
    537                                           , symbol=symbol
    538                                           , decl_type=decl_type
    539                                           , return_type=return_type
    540                                           , arg_types=arg_types
    541                                           , header_dir=header_dir
    542                                           , header_file=header_file
    543                                           , recursive=recursive )
    544
    545 -    def member_function( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    546          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    547          return self.global_ns.member_function( name=name
    548                                                 , function=function
    549                                                 , return_type=return_type
    550                                                 , arg_types=arg_types
    551                                                 , header_dir=header_dir
    552                                                 , header_file=header_file
    553                                                 , recursive=recursive )
    554      mem_fun = member_function
    555
    556 -    def member_functions( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    557          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    558          return self.global_ns.member_functions( name=name
    559                                                  , function=function
    560                                                  , return_type=return_type
    561                                                  , arg_types=arg_types
    562                                                  , header_dir=header_dir
    563                                                  , header_file=header_file
    564                                                  , recursive=recursive)
    565
    566      mem_funs = member_functions
    567
    568 -    def constructor( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    569          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    570          return self.global_ns.constructor( name=name
    571                                             , function=function
    572                                             , return_type=return_type
    573                                             , arg_types=arg_types
    574                                             , header_dir=header_dir
    575                                             , header_file=header_file
    576                                             , recursive=recursive )
    577
    578 -    def constructors( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    579          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    580          return self.global_ns.constructors( name=name
    581                                              , function=function
    582                                              , return_type=return_type
    583                                              , arg_types=arg_types
    584                                              , header_dir=header_dir
    585                                              , header_file=header_file
    586                                              , recursive=recursive)
    587
    588 -    def member_operator( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    589          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    590          return self.global_ns.member_operator( name=name
    591                                                 , symbol=symbol
    592                                                 , function=function
    593                                                 , return_type=return_type
    594                                                 , arg_types=arg_types
    595                                                 , header_dir=header_dir
    596                                                 , header_file=header_file
    597                                                 , recursive=recursive )
    598
    599 -    def member_operators( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    600          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    601          return self.global_ns.member_operators( name=name
    602                                                  , symbol=symbol
    603                                                  , function=function
    604                                                  , return_type=return_type
    605                                                  , arg_types=arg_types
    606                                                  , header_dir=header_dir
    607                                                  , header_file=header_file
    608                                                  , recursive=recursive )
    609
    610 -    def casting_operator( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    611          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    612          return self.global_ns.casting_operator( name=name
    613                                                  , function=function
    614                                                  , return_type=return_type
    615                                                  , arg_types=arg_types
    616                                                  , header_dir=header_dir
    617                                                  , header_file=header_file
    618                                                  , recursive=recursive )
    619
    620 -    def casting_operators( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    621          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    622          return self.global_ns.casting_operators( name=name
    623                                                   , function=function
    624                                                   , return_type=return_type
    625                                                   , arg_types=arg_types
    626                                                   , header_dir=header_dir
    627                                                   , header_file=header_file
    628                                                   , recursive=recursive)
    629
    630 -    def enumeration( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
    631          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    632          return self.global_ns.enumeration( name=name
    633                                             , function=function
    634                                             , header_dir=header_dir
    635                                             , header_file=header_file
    636                                             , recursive=recursive)
    637      enum = enumeration
    638
    639 -    def enumerations( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ):
    640          """Please see L{decl_wrappers.scopedef_t} class documentation"""
    641          return self.global_ns.enumerations( name=name
    642                                              , function=function
    643                                              , header_dir=header_dir
    644                                              , header_file=header_file
    645                                              , recursive=recursive)
    646
    647      enums = enumerations
    648
    649 -    def namespace( self, name=None, function=None, recursive=None ):
    650          """Please see L{decl_wrappers.namespace_t} class documentation"""
    651          return self.global_ns.namespace( name=name
    652                                           , function=function
    653                                           , recursive=recursive )
    654
    655 -    def namespaces( self, name=None, function=None, recursive=None ):
    656          """Please see L{decl_wrappers.namespace_t} class documentation"""
    657          return self.global_ns.namespaces( name=name
    658                                            , function=function
    659                                            , recursive=recursive )
    660
    661 -    def free_function( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    662          """Please see L{decl_wrappers.namespace_t} class documentation"""
    663          return self.global_ns.free_function( name=name
    664                                               , function=function
    665                                               , return_type=return_type
    666                                               , arg_types=arg_types
    667                                               , header_dir=header_dir
    668                                               , header_file=header_file
    669                                               , recursive=recursive )
    670      free_fun = free_function
    671
    672 -    def free_functions( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    673          """Please see L{decl_wrappers.namespace_t} class documentation"""
    674          return self.global_ns.free_functions( name=name
    675                                                , function=function
    676                                                , return_type=return_type
    677                                                , arg_types=arg_types
    678                                                , header_dir=header_dir
    679                                                , header_file=header_file
    680                                                , recursive=recursive)
    681      free_funs = free_functions
    682
    683 -    def free_operator( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    684          """Please see L{decl_wrappers.namespace_t} class documentation"""
    685          return self.global_ns.free_operator( name=name
    686                                               , symbol=symbol
    687                                               , function=function
    688                                               , return_type=return_type
    689                                               , arg_types=arg_types
    690                                               , header_dir=header_dir
    691                                               , header_file=header_file
    692                                               , recursive=recursive )
    693
    694 -    def free_operators( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ):
    695          """Please see L{decl_wrappers.namespace_t} class documentation"""
    696          return self.global_ns.free_operators( name=name
    697                                                , symbol=symbol
    698                                                , function=function
    699                                                , return_type=return_type
    700                                                , arg_types=arg_types
    701                                                , header_dir=header_dir
    702                                                , header_file=header_file
    703                                                , recursive=recursive )
    704
    705 -    def _get_BOOST_PYTHON_MAX_ARITY( self ):
    706          return decl_wrappers.calldef_t.BOOST_PYTHON_MAX_ARITY
    707 -    def _set_BOOST_PYTHON_MAX_ARITY( self, value ):
    708          decl_wrappers.calldef_t.BOOST_PYTHON_MAX_ARITY = value
    709      BOOST_PYTHON_MAX_ARITY = property( _get_BOOST_PYTHON_MAX_ARITY, _set_BOOST_PYTHON_MAX_ARITY )
    710