def cmd(admin_only=False, acl='<STR_LIT:*>', aliases=None, while_ignored=False, *args, **kwargs):
def wrapper(func):<EOL><INDENT>func.is_cmd = True<EOL>func.is_subcmd = len(func.__name__.split('<STR_LIT:_>')) > <NUM_LIT:1><EOL>func.cmd_name = func.__name__.replace('<STR_LIT:_>', '<STR_LIT:U+0020>')<EOL>func.admin_only = admin_only<EOL>func.acl = acl<EOL>func.aliases = aliases<EOL>func.while_ignored = while_ignored<EOL>return func<EOL><DEDENT>return wrapper<EOL>
Decorator to mark plugin functions as commands in the form of !<cmd_name>

* admin_only - indicates only users in bot_admin are allowed to execute (only used if AuthManager is loaded)
* acl - indicates which ACL to perform permission checks against (only used if AuthManager is loaded)
* aliases - register function with additional commands (i.e. !alias1, !alias2, etc)
* while_ignored - allows a command to be run, even if channel has been !sleep