def describe(o):
<EOL>from inspect import getmodule<EOL>from acorn.logging.decoration import _fqdn<EOL>fqdn = _fqdn(o, False)<EOL>if fqdn is None:<EOL><INDENT>return json_describe(o, str(type(o)))<EOL><DEDENT>package = fqdn.split('<STR_LIT:.>')[<NUM_LIT:0>]<EOL>global _package_desc<EOL>if package not in _package_desc:<EOL><INDENT>from acorn.config import descriptors<EOL>spack = descriptors(package)<EOL>if spack is None:<EOL><INDENT>_package_desc[package] = None<EOL>return json_describe(o, fqdn)<EOL><DEDENT>else:<EOL><INDENT>_package_desc[package] = spack<EOL><DEDENT><DEDENT>if _package_desc[package] is None:<EOL><INDENT>return json_describe(o, fqdn)<EOL><DEDENT>elif fqdn in _package_desc[package]:<EOL><INDENT>return json_describe(o, fqdn, _package_desc[package][fqdn])<EOL><DEDENT>else:<EOL><INDENT>return json_describe(o, fqdn)<EOL><DEDENT>
Describes the object using developer-specified attributes specific to
    each main object type.

    Returns:
        dict: keys are specific attributes tailored to the specific object type,
        though `fqdn` is common to all descriptions; values are the corresponding
        attribute values which are *simple* types that can easily be serialized to
        JSON.