'Dynamically create and register a custom interpreted text role.'

def run(self):

    if ((self.content_offset > self.lineno) or (not self.content)):
        raise self.error(('"%s"    directive    requires    arguments    on    the    first    line.' % self.name))
    args = self.content[0]
    match = self.argument_pattern.match(args)
    if (not match):
        raise self.error(('"%s"    directive    arguments    not    valid    role    names:    "%s".' % (self.name, args)))
    new_role_name = match.group(1)
    base_role_name = match.group(3)
    messages = []
    if base_role_name:
        (base_role, messages) = roles.role(base_role_name, self.state_machine.language, self.lineno, self.state.reporter)
        if (base_role is None):
            error = self.state.reporter.error(('Unknown    interpreted    text    role    "%s".' % base_role_name), nodes.literal_block(self.block_text, self.block_text), line=self.lineno)
            return (messages + [error])
    else:
        base_role = roles.generic_custom_role
    assert (not hasattr(base_role, 'arguments')), ('Supplemental    directive    arguments    for    "%s"    directive    not    supported    (specified    by    "%r"    role).' % (self.name, base_role))
    try:
        converted_role = convert_directive_function(base_role)
        (arguments, options, content, content_offset) = self.state.parse_directive_block(self.content[1:], self.content_offset, converted_role, option_presets={})
    except states.MarkupError as detail:
        error = self.state_machine.reporter.error(('Error    in    "%s"    directive:\n%s.' % (self.name, detail)), nodes.literal_block(self.block_text, self.block_text), line=self.lineno)
        return (messages + [error])
    if (not options.has_key('class')):
        try:
            options['class'] = directives.class_option(new_role_name)
        except ValueError as detail:
            error = self.state_machine.reporter.error(('Invalid    argument    for    "%s"    directive:\n%s.' % (self.name, detail)), nodes.literal_block(self.block_text, self.block_text), line=self.lineno)
            return (messages + [error])
    role = roles.CustomRole(new_role_name, base_role, options, content)
    roles.register_local_role(new_role_name, role)
    return messages
