code: def register_action (self, action_name, command='', bound_list = [], flags = [],
                           function = None):
          
          assert isinstance(action_name, basestring)
          assert isinstance(command, basestring)
          assert is_iterable(bound_list)
          assert is_iterable(flags)
          assert function is None or callable(function)
  
          bjam_flags = reduce(operator.or_,
                              (action_modifiers[flag] for flag in flags), 0)
  
          # We allow command to be empty so that we can define 'action' as pure
          # python function that would do some conditional logic and then relay
          # to other actions.
          assert command or function
          if command:
              bjam_interface.define_action(action_name, command, bound_list, bjam_flags)
  
          self.actions[action_name] = BjamAction(
              action_name, function, has_command=bool(command))
docs: Creates a new build engine action.
  
          Creates on bjam side an action named 'action_name', with
          'command' as the command to be executed, 'bound_variables'
          naming the list of variables bound when the command is executed
          and specified flag.
          If 'function' is not None, it should be a callable taking three
          parameters:
              - targets
              - sources
              - instance of the property_set class
          This function will be called by set_update_action, and can
          set additional target variables.