/// <summary>
        /// Creates a formatted string describing a given geometric object.
        /// </summary>
        /// <param name="formatter">The output formatter.</param>
        /// <param name="geometricObject">The geometric object.</param>
        /// <returns>The string representing the geometric object.</returns>
        public static string FormatGeometricObject(this OutputFormatter formatter, GeometricObject geometricObject)
        {
            // Prepare the result
            var result = "";

            // If the physical object is present, append it's name
            if (geometricObject.ConfigurationObject != null)
            {
                result += formatter.GetObjectName(geometricObject.ConfigurationObject);
            }

            // Furthermore switch based on type
            switch (geometricObject)
            {
            // If we have an object with points...
            case DefinableByPoints objectWithPoints:

                // If there are no points, then we're done
                if (objectWithPoints.Points.IsEmpty())
                {
                    return(result);
                }

                // Otherwise we convert points
                var pointsString = objectWithPoints.Points
                                   // By taking their names
                                   .Select(point => formatter.GetObjectName(point.ConfigurationObject))
                                   // Ordering them
                                   .Ordered()
                                   // And joining with commas
                                   .ToJoinedString();

                // And return based on whether this is a line or circle
                return(objectWithPoints switch
                {
                    // Enclose line points in []
                    LineObject _ => $"{result}[{pointsString}]",

                    // Enclose circle points in ()
                    CircleObject _ => $"{result}({pointsString})",

                    // Otherwise we have an unhandled type
                    _ => throw new ConstructorException($"Unhandled type of {nameof(DefinableByPoints)}: {objectWithPoints.GetType()}")
                });