diff --git a/.gitignore b/.gitignore
index 32858aa..c3106dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,12 +1,60 @@
+# Compiled source #
+###################
+*.com
*.class
+*.dll
+*.exe
+*.o
+*.so
-# Mobile Tools for Java (J2ME)
+# Packages #
+############
+# it's better to unpack these files and commit the raw source
+# git has its own built in compression methods
+*.7z
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.zip
+
+# Logs and databases #
+######################
+*.log
+*.sql
+*.sqlite
+
+# OS generated files #
+######################
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+
+# intellij files #
+##################
+.idea/
+*.iml
+
+# Compiled java #
+#################
+target/
+*.class
+
+# Mobile Tools for Java (J2ME) #
+################################
.mtj.tmp/
-# Package Files #
-*.jar
-*.war
-*.ear
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml #
+##########################################################################################
hs_err_pid*
+
+# junk files #
+##############
+test.txt
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..d51dcd0
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,33 @@
+
+
+ 4.0.0
+
+ squier.john
+ TypeInformation
+ 1.0-SNAPSHOT
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+
+ junit
+ junit
+ 4.12
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/squier/john/unitcorn/ClassInHierarchyLacksNoArgConstructor.java b/src/main/java/squier/john/unitcorn/ClassInHierarchyLacksNoArgConstructor.java
new file mode 100644
index 0000000..68803b7
--- /dev/null
+++ b/src/main/java/squier/john/unitcorn/ClassInHierarchyLacksNoArgConstructor.java
@@ -0,0 +1,6 @@
+package squier.john.unitcorn;
+
+/**
+ * @author John A. Squier
+ */
+public class ClassInHierarchyLacksNoArgConstructor extends Exception { }
diff --git a/src/main/java/squier/john/unitcorn/ReflectionUtils.java b/src/main/java/squier/john/unitcorn/ReflectionUtils.java
new file mode 100644
index 0000000..d49265a
--- /dev/null
+++ b/src/main/java/squier/john/unitcorn/ReflectionUtils.java
@@ -0,0 +1,333 @@
+package squier.john.unitcorn;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.*;
+
+/**
+ * Created by John A. Squier on 2/15/17.
+ * TODO multiple refactor spots in src
+ */
+public class ReflectionUtils {
+
+ public static boolean classImplementsInterface(String aClassName, String anInterfaceName) {
+ Class> classClass = getClassClassFromString(aClassName);
+ Class> interfaceClassClass = getClassClassFromString(anInterfaceName);
+ return interfaceClassClass != null && ((classClass == null) ? checkClassForInterface(aClassName.getClass(), interfaceClassClass) :
+ checkClassForInterface(classClass, interfaceClassClass));
+ }
+
+ public static boolean classImplementsInterface(Class> theClass, String anInterface) {
+ return classImplementsInterface(theClass.getName(), anInterface);
+ }
+
+ public static boolean classImplementsInterface(Object o, String theInterface) {
+ return classImplementsInterface(o.getClass(), theInterface);
+ }
+
+ public static String listAllMembers(Object o) {
+ Class> c = o.getClass();
+ StringBuilder sb = new StringBuilder();
+ sb.append(classInfoString(c));
+
+ while ( hasASuperClass(c) ) {
+ c = c.getSuperclass();
+ sb.append(classInfoString(c));
+ }
+ return sb.toString();
+ }
+
+ public static String getClassHierarchy(Object o) {
+ Class> theClass = o.getClass();
+ List> classHierarchyInReverse = new ArrayList<>();
+
+ classHierarchyInReverse.add(theClass);
+ while ( hasASuperClass(theClass) ) {
+ theClass = theClass.getSuperclass();
+ classHierarchyInReverse.add(theClass);
+ }
+ return generateClassHierarchyString(classHierarchyInReverse);
+ }
+
+ // @@@ refactor
+ public static List