diff --git a/Homework/Homework.csproj b/Homework/Homework.csproj
new file mode 100644
index 00000000..bc4bb846
--- /dev/null
+++ b/Homework/Homework.csproj
@@ -0,0 +1,11 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+ Library
+
+
+
diff --git a/Homework/IPrintingConfig.cs b/Homework/IPrintingConfig.cs
new file mode 100644
index 00000000..0a6009b4
--- /dev/null
+++ b/Homework/IPrintingConfig.cs
@@ -0,0 +1,14 @@
+using System.Globalization;
+using System.Reflection;
+
+namespace Homework;
+
+public interface IPrintingConfig
+{
+ HashSet ExcludeTypes { get; }
+ HashSet ExcludeMembers { get; }
+ Dictionary> AlternativeTypesSerialization { get; }
+ Dictionary> AlternativeMembersSerialization { get; }
+ Dictionary TypesCultureInfo { get; }
+ Dictionary StringsTrim { get; }
+}
diff --git a/Homework/IPropertyPrintingConfig.cs b/Homework/IPropertyPrintingConfig.cs
new file mode 100644
index 00000000..6d1c8fd4
--- /dev/null
+++ b/Homework/IPropertyPrintingConfig.cs
@@ -0,0 +1,9 @@
+using System.Reflection;
+
+namespace Homework;
+
+public interface IPropertyPrintingConfig
+{
+ PrintingConfig ParentConfig { get; }
+ MemberInfo? MemberInfo { get; }
+}
diff --git a/Homework/LastMemberVisitor.cs b/Homework/LastMemberVisitor.cs
new file mode 100644
index 00000000..0daaada6
--- /dev/null
+++ b/Homework/LastMemberVisitor.cs
@@ -0,0 +1,15 @@
+using System.Linq.Expressions;
+
+namespace Homework;
+
+public class LastMemberVisitor : ExpressionVisitor
+{
+ public MemberExpression? LastMemberExpression { get; private set; }
+
+ protected override Expression VisitMember(MemberExpression node)
+ {
+ LastMemberExpression = node;
+
+ return base.VisitMember(node);
+ }
+}
diff --git a/Homework/ObjectExtensions.cs b/Homework/ObjectExtensions.cs
new file mode 100644
index 00000000..020dfe39
--- /dev/null
+++ b/Homework/ObjectExtensions.cs
@@ -0,0 +1,9 @@
+namespace Homework;
+
+public static class ObjectExtensions
+{
+ public static string PrintToString(this T obj)
+ {
+ return ObjectPrinter.For().PrintToString(obj);
+ }
+}
\ No newline at end of file
diff --git a/Homework/ObjectPrinter.cs b/Homework/ObjectPrinter.cs
new file mode 100644
index 00000000..58e9519e
--- /dev/null
+++ b/Homework/ObjectPrinter.cs
@@ -0,0 +1,9 @@
+namespace Homework;
+
+public class ObjectPrinter
+{
+ public static PrintingConfig For()
+ {
+ return new PrintingConfig();
+ }
+}
\ No newline at end of file
diff --git a/Homework/ObjectReferenceEqualityComparer.cs b/Homework/ObjectReferenceEqualityComparer.cs
new file mode 100644
index 00000000..32726cd5
--- /dev/null
+++ b/Homework/ObjectReferenceEqualityComparer.cs
@@ -0,0 +1,16 @@
+using System.Diagnostics.CodeAnalysis;
+
+namespace Homework;
+
+public class ObjectReferenceEqualityComparer : IEqualityComparer