code: def doublewrap(f):
      '''
      a decorator decorator, allowing the decorator to be used as:
      @decorator(with, arguments, and=kwargs)
      or
      @decorator
      Ref: http://stackoverflow.com/questions/653368/how-to-create-a-python-decorator-that-can-be-used-either-with-or-without-paramet
      '''
      @functools.wraps(f)
      def new_dec(*args, **kwargs):
          if len(args) == 1 and len(kwargs) == 0 and callable(args[0]):
              # actual decorated function
              return f(args[0])
          else:
              # decorator arguments
              return lambda realf: f(realf, *args, **kwargs)
  
      return new_def doublewrap(f):
      '''
      a decorator decorator, allowing the decorator to be used as:
      @decorator(with, arguments, and=kwargs)
      or
      @decorator
      Ref: http://stackoverflow.com/questions/653368/how-to-create-a-python-decorator-that-can-be-used-either-with-or-without-paramet
      '''
      @functools.wraps(f)
      def new_dec(*args, **kwargs):
          if len(args) == 1 and len(kwargs) == 0 and callable(args[0]):
              # actual decorated function
              return f(args[0])
          else:
              # decorator arguments
              return lambda realf: f(realf, *args, **kwargs)
  
      return new_dec
docs: a decorator decorator, allowing the decorator to be used as:
      @decorator(with, arguments, and=kwargs)
      or
      @decorator
      Ref: http://stackoverflow.com/questions/653368/how-to-create-a-python-decorator-that-can-be-used-either-with-or-without-paramet