'Introspect the field type and constraints, generate model,
binding and widget and extract i18n strings. The results
can be accessed via the lazy properties model, binding, widget,
and strings.
@return: nothing'

def _introspect(self):

    field = self.field
    self._strings = {}
    self._model = TAG[self.name]()
    readonly = None
    required = None
    if (not field.writable):
        readonly = 'true()'
    elif self._required(field):
        required = 'true()'
    attr = {'_nodeset': self.ref, '_required': required, '_readonly': readonly}
    fieldtype = self.types.get(str(field.type), 'string')
    requires = field.requires
    options = False
    multiple = False
    if requires:
        if (not isinstance(requires, list)):
            requires = [requires]
        first = requires[0]
        if hasattr(first, 'options'):
            options = True
            if (hasattr(first, 'multiple') and first.multiple):
                multiple = True
        elif (fieldtype in ('decimal', 'int', 'date', 'datetime')):
            constraint = self._range(requires)
            if constraint:
                attr['_constraint'] = constraint
    if (not options):
        attr['_type'] = fieldtype
    self._binding = TAG['bind'](**attr)
    if hasattr(field, 'xform'):
        widget = field.xform
    else:
        if (not field.writable):
            widget_type = 'readonly'
        else:
            widget_type = str(field.type)
            if options:
                if multiple:
                    widget_type = 'multiple'
                else:
                    widget_type = 'options'
        widgets = self.widgets
        if (widget_type in widgets):
            widget = widgets[widget_type]
        else:
            widget = None
    if (widget is not None):
        if isinstance(widget, type):
            widget = widget(translate=self.translate)
        if hasattr(field, 'label'):
            label = field.label
        else:
            label = None
        if (not label):
            label = current.T('    '.join((s.capitalize() for s in self.name.split('_'))).strip())
        (self._widget, strings) = widget(field, label, self.ref)
        if self.translate:
            self._strings.update(strings)
    else:
        self._widget = TAG['']()
    return
