class_docstr: Metaclass for attribute collector classes
  
  Classes that use this metaclass are intended to collect vertex/edge
  attributes from various sources (a Python dict, a vertex/edge sequence,
  default values from the igraph configuration and such) in a given
  order of precedence. See the module documentation for more details.
  This metaclass enables the user to use a simple declarative syntax
  to specify which attributes he is interested in. For each vertex/edge
  attribute, a corresponding class attribute must be defined with a
  value that describes the default value of that attribute if no other
  data source provides us with any suitable value. The default value
  can also be a tuple; in that case, the first element of the tuple
  is the actual default value, the second element is a converter
  function that will convert the attribute values to a format expected
  by the caller who uses the class being defined.
  
  There is a special class attribute called C{_kwds_prefix}; this is
  not used as an attribute declaration. It can contain a string which
  will be used to derive alternative names for the attributes when
  the attribute is accessed in a Python dict. This is useful in many
  situations; for instance, the default graph drawer would want to access
  the vertex colors using the C{color} vertex attribute, but when
  it looks at the keyword arguments passed to the original call of
  L{igraph.Graph.__plot__}, the C{vertex_color} keyword argument should
  be looked up because we also have colors for the edges. C{_kwds_prefix}
  will be prepended to the attribute names when they are looked up in
  a dict of keyword arguments.
  
  If you require a more fine-tuned behaviour, you can assign an
  L{AttributeSpecification} instance to a class attribute directly.
  
  @see: AttributeCollectorBase
code: def __new__(mcs, name, bases, attrs):
      attr_specs = []
      for attr, value in attrs.items():
          if attr.startswith("_") or callable(value):
              continue
          if isinstance(value, AttributeSpecification):
              attr_spec = value
          elif isinstance(value, dict):
              attr_spec = AttributeSpecification(attr, **value)
          else:
              attr_spec = AttributeSpecification(attr, value)
          attr_specs.append(attr_spec)
  
      prefix = attrs.get("_kwds_prefix", None)
      if prefix:
          for attr_spec in attr_specs:
              if attr_spec.name == attr_spec.alt_name:
                  attr_spec.alt_name = "%s%s" % (prefix, attr_spec.name)
  
      attrs["_attributes"] = attr_specs
      attrs["Element"] = mcs.record_generator(
          "%s.Element" % name,
          (attr_spec.name for attr_spec in attr_specs),
      )
  
      return super().__new__(mcs, name, bases, attrs)
  
file_path: python-igraph/src/igraph/drawing/metamagic.py
imports: from configparser import NoOptionError
  from igraph.configuration import Configuration
label_desc: Use image node_id 1 for calling the AttributeCollectorMeta obj's underlying member method code with example usage: obj.__new__(mcs, name, bases, attrs) and returns: super