// Path: src/main/java/net/davidtanzer/jobjectformatter/FormattedStringGenerator.java
// public class FormattedStringGenerator {
// 	private final TypeInfoCache typeInfoCache;
// 	private final ObjectValuesCompiler objectValuesCompiler;
// 	private final ObjectStringFormatter toStringFormatter;
// 
// 	/**
// 	 * Creates a new FormattedStringGenerator that uses a {@link net.davidtanzer.jobjectformatter.formatter.SimpleFormatter} to format the string.
// 	 *
// 	 * @see net.davidtanzer.jobjectformatter.formatter.SimpleFormatter
// 	 */
// 	public FormattedStringGenerator() {
// 		this(new SimpleFormatter(), new TypeInfoCache(), new ObjectValuesCompiler());
// 	}
// 
// 	/**
// 	 * Creates a new FormattedStringGenerator with a given {@link net.davidtanzer.jobjectformatter.formatter.ObjectStringFormatter}.
// 	 *
// 	 * @param toStringFormatter The formatter to use when creating formatted strings.
// 	 * @see net.davidtanzer.jobjectformatter.formatter.ObjectStringFormatter
// 	 */
// 	public FormattedStringGenerator(final ObjectStringFormatter toStringFormatter) {
// 		this(toStringFormatter, new TypeInfoCache(), new ObjectValuesCompiler());
// 	}
// 
// 	FormattedStringGenerator(final ObjectStringFormatter objectStringFormatter, final TypeInfoCache typeInfoCache, final ObjectValuesCompiler objectValuesCompiler) {
// 		if(objectStringFormatter == null) {
// 			throw new IllegalArgumentException("Parameter objectStringFormatter must not be null!");
// 		}
// 		assert typeInfoCache != null : "Parameter typeInfoCache must not be null!";
// 		assert objectValuesCompiler != null : "Parameter objectValuesCompiler must not be null!";
// 
// 		this.toStringFormatter = objectStringFormatter;
// 		this.typeInfoCache = typeInfoCache;
// 		this.objectValuesCompiler = objectValuesCompiler;
// 	}
// 
// 	/**
// 	 * Creates a formatted String representation of an object.
// 	 * 
// 	 * @param object The object to format.
// 	 * @return The formatted String representation.
// 	 */
// 	public String format(final Object object) {
// 		if(object==null) {
// 			throw new IllegalArgumentException("Parameter object must not be null!");
// 		}
// 
// 		final TypeInfo typeInfo = typeInfoCache.typeInfoFor(object.getClass());
// 		final ObjectValuesInfo objectValuesInfo = objectValuesCompiler.compileToStringInfo(typeInfo, object);
// 
// 		return toStringFormatter.format(objectValuesInfo);
// 	}
// }
// 
// Path: src/main/java/net/davidtanzer/jobjectformatter/ObjectFormatter.java
// public class ObjectFormatter {
// 	private static AtomicReference<FormattedStringGenerator> generator = new AtomicReference<>(new FormattedStringGenerator());
// 
// 	/**
// 	 * Configure the {@link net.davidtanzer.jobjectformatter.FormattedStringGenerator} to use when formatting objects.
// 	 *
// 	 * @param generator The globally configured generator.
// 	 */
// 	public static void configureGenerator(final FormattedStringGenerator generator) {
// 		ObjectFormatter.generator.set(generator);
// 	}
// 
// 	/**
// 	 * Format an object with the globally configured {@link net.davidtanzer.jobjectformatter.FormattedStringGenerator}.
// 	 *
// 	 * @param object The object to format.
// 	 * @return The string representation of the object.
// 	 */
// 	public static String format(final Object object) {
// 		return generator.get().format(object);
// 	}
// }


import net.davidtanzer.jobjectformatter.FormattedStringGenerator;
import net.davidtanzer.jobjectformatter.ObjectFormatter;
import net.davidtanzer.jobjectformatter.annotations.*;
import net.davidtanzer.jobjectformatter.formatter.*;
import java.util.Arrays;
import java.util.List;
package net.davidtanzer.jobjectformatter.examples.formatters;



public class FormattersExample {
	public static void main(String[] args) {
		Role role = new Role("admin");
		Address address = new Address("Evergreen Terrace", "12b");
		Person person = new Person("Jane", "Doe", address, "jdoe", Arrays.asList(role));
		address.setOwner(person);

// Path: src/main/java/net/davidtanzer/jobjectformatter/FormattedStringGenerator.java
// public class FormattedStringGenerator {
// 	private final TypeInfoCache typeInfoCache;
// 	private final ObjectValuesCompiler objectValuesCompiler;
// 	private final ObjectStringFormatter toStringFormatter;
// 
// 	/**
// 	 * Creates a new FormattedStringGenerator that uses a {@link net.davidtanzer.jobjectformatter.formatter.SimpleFormatter} to format the string.
// 	 *
// 	 * @see net.davidtanzer.jobjectformatter.formatter.SimpleFormatter
// 	 */
// 	public FormattedStringGenerator() {
// 		this(new SimpleFormatter(), new TypeInfoCache(), new ObjectValuesCompiler());
// 	}
// 
// 	/**
// 	 * Creates a new FormattedStringGenerator with a given {@link net.davidtanzer.jobjectformatter.formatter.ObjectStringFormatter}.
// 	 *
// 	 * @param toStringFormatter The formatter to use when creating formatted strings.
// 	 * @see net.davidtanzer.jobjectformatter.formatter.ObjectStringFormatter
// 	 */
// 	public FormattedStringGenerator(final ObjectStringFormatter toStringFormatter) {
// 		this(toStringFormatter, new TypeInfoCache(), new ObjectValuesCompiler());
// 	}
// 
// 	FormattedStringGenerator(final ObjectStringFormatter objectStringFormatter, final TypeInfoCache typeInfoCache, final ObjectValuesCompiler objectValuesCompiler) {
// 		if(objectStringFormatter == null) {
// 			throw new IllegalArgumentException("Parameter objectStringFormatter must not be null!");
// 		}
// 		assert typeInfoCache != null : "Parameter typeInfoCache must not be null!";
// 		assert objectValuesCompiler != null : "Parameter objectValuesCompiler must not be null!";
// 
// 		this.toStringFormatter = objectStringFormatter;
// 		this.typeInfoCache = typeInfoCache;
// 		this.objectValuesCompiler = objectValuesCompiler;
// 	}
// 
// 	/**
// 	 * Creates a formatted String representation of an object.
// 	 * 
// 	 * @param object The object to format.
// 	 * @return The formatted String representation.
// 	 */
// 	public String format(final Object object) {
// 		if(object==null) {
// 			throw new IllegalArgumentException("Parameter object must not be null!");
// 		}
// 
// 		final TypeInfo typeInfo = typeInfoCache.typeInfoFor(object.getClass());
// 		final ObjectValuesInfo objectValuesInfo = objectValuesCompiler.compileToStringInfo(typeInfo, object);
// 
// 		return toStringFormatter.format(objectValuesInfo);
// 	}
// }
// 
// Path: src/main/java/net/davidtanzer/jobjectformatter/ObjectFormatter.java
// public class ObjectFormatter {
// 	private static AtomicReference<FormattedStringGenerator> generator = new AtomicReference<>(new FormattedStringGenerator());
// 
// 	/**
// 	 * Configure the {@link net.davidtanzer.jobjectformatter.FormattedStringGenerator} to use when formatting objects.
// 	 *
// 	 * @param generator The globally configured generator.
// 	 */
// 	public static void configureGenerator(final FormattedStringGenerator generator) {
// 		ObjectFormatter.generator.set(generator);
// 	}
// 
// 	/**
// 	 * Format an object with the globally configured {@link net.davidtanzer.jobjectformatter.FormattedStringGenerator}.
// 	 *
// 	 * @param object The object to format.
// 	 * @return The string representation of the object.
// 	 */
// 	public static String format(final Object object) {
// 		return generator.get().format(object);
// 	}
// }


// Path: src/main/java/net/davidtanzer/jobjectformatter/examples/formatters/FormattersExample.java
import net.davidtanzer.jobjectformatter.FormattedStringGenerator;
import net.davidtanzer.jobjectformatter.ObjectFormatter;
import net.davidtanzer.jobjectformatter.annotations.*;
import net.davidtanzer.jobjectformatter.formatter.*;
import java.util.Arrays;
import java.util.List;

package net.davidtanzer.jobjectformatter.examples.formatters;



public class FormattersExample {
	public static void main(String[] args) {
		Role role = new Role("admin");
		Address address = new Address("Evergreen Terrace", "12b");
		Person person = new Person("Jane", "Doe", address, "jdoe", Arrays.asList(role));
		address.setOwner(person);

		ObjectFormatter.configureGenerator(new FormattedStringGenerator(new SimpleFormatter()));