'This method is called by the cmdhandler once the command name
has been identified. It creates a new set of member variables
that can be later accessed from self.func() (see below)
The following variables are available for our use when entering this
method (from the command definition, and assigned on the fly by the
cmdhandler):
self.key - the name of this command (\'look\')
self.aliases - the aliases of this cmd (\'l\')
self.permissions - permission string for this command
self.help_category - overall category of command
self.caller - the object calling this command
self.cmdstring - the actual command name used to call this
(this allows you to know which alias was used,
for example)
self.args - the raw input; everything following self.cmdstring.
self.cmdset - the cmdset from which this command was picked. Not
often used (useful for commands like \'help\' or to
list all available commands etc)
self.obj - the object on which this command was defined. It is often
the same as self.caller.
A MUX command has the following possible syntax:
name[ with several words][/switch[/switch..]] arg1[,arg2,...] [[=|,] arg[,..]]
The \'name[ with several words]\' part is already dealt with by the
cmdhandler at this point, and stored in self.cmdname (we don\'t use
it here). The rest of the command is stored in self.args, which can
start with the switch indicator /.
This parser breaks self.args into its constituents and stores them in the
following variables:
self.switches = [list of /switches (without the /)]
self.raw = This is the raw argument input, including switches
self.args = This is re-defined to be everything *except* the switches
self.lhs = Everything to the left of = (lhs:\'left-hand side\'). If
no = is found, this is identical to self.args.
self.rhs: Everything to the right of = (rhs:\'right-hand side\').
If no \'=\' is found, this is None.
self.lhslist - [self.lhs split into a list by comma]
self.rhslist - [list of self.rhs split into a list by comma]
self.arglist = [list of space-separated args (stripped, including \'=\' if it exists)]
All args and list members are stripped of excess whitespace around the
strings, but case is preserved.'

def parse(self):

    raw = self.args
    args = raw.strip()
    switches = []
    if (args and (len(args) > 1) and (raw[0] == '/')):
        switches = args[1:].split(None, 1)
        if (len(switches) > 1):
            (switches, args) = switches
            switches = switches.split('/')
        else:
            args = ''
            switches = switches[0].split('/')
    arglist = [arg.strip() for arg in args.split()]
    (lhs, rhs) = (args, None)
    (lhslist, rhslist) = ([arg.strip() for arg in args.split(',')], [])
    if (args and ('=' in args)):
        (lhs, rhs) = [arg.strip() for arg in args.split('=', 1)]
        lhslist = [arg.strip() for arg in lhs.split(',')]
        rhslist = [arg.strip() for arg in rhs.split(',')]
    self.raw = raw
    self.switches = switches
    self.args = args.strip()
    self.arglist = arglist
    self.lhs = lhs
    self.lhslist = lhslist
    self.rhs = rhs
    self.rhslist = rhslist
    if (hasattr(self, 'player_caller') and self.player_caller):
        if utils.inherits_from(self.caller, 'evennia.objects.objects.DefaultObject'):
            self.character = self.caller
            self.caller = self.caller.player
        elif utils.inherits_from(self.caller, 'evennia.players.players.DefaultPlayer'):
            self.character = self.caller.get_puppet(self.session)
        else:
            self.character = None
