private TableParser init() {
        final Table tableAnnotation = mClass.getAnnotation(Table.class);
        final String tableName = tableAnnotation.value();

        PrimaryKeyDef primaryKeyDef = null;
        ColumnDef uniqueKeyDef = null;
        final List<ForeignKeyDef> foreignKeyDefs = Lists.newArrayList();
        final List<ColumnDef> columnDefs = Lists.newArrayList();
        final List<Field> foreignFields = Lists.newArrayList();
        final List <Field> columnFields = Lists.newArrayList();

        final Field[] fields = mClass.getDeclaredFields();
        for (final Field field : fields) {
            LOG.debug("init - field:" + field);

            field.setAccessible(true);
            final Column column = field.getAnnotation(Column.class);
            if (column == null) {
                continue;
            }

            final PrimaryKey primaryKey = field.getAnnotation(PrimaryKey.class);
            final UniqueKey uniqueKey = field.getAnnotation(UniqueKey.class);
            final Foreign foreign = field.getAnnotation(Foreign.class);

            if (primaryKey != null) {
                if (primaryKeyDef != null) {
                    throw new IllegalStateException(
                            "More than 1 primay key found!");
                }

                mPrimaryKeyField = field;
                final ColumnDef columnDef = new ColumnDef(
                        field.getType(), column.value());
                primaryKeyDef = new PrimaryKeyDef(columnDef);
            } else if (uniqueKey != null) {
                if (uniqueKeyDef != null) {
                    throw new IllegalStateException(
                            "More than 1 unique key found!");
                }

                mUniqueKeyField = field;
                uniqueKeyDef = new ColumnDef(field.getType(),
                        column.value());
            } else if (foreign != null) {
                foreignFields.add(field);
                final TableDef tableDef = TableParser.getTableParser(
                        field.getType()).getTableDef();
                foreignKeyDefs.add(new ForeignKeyDef(column.value(), tableDef));
            } else {
                columnFields.add(field);
                columnDefs.add(new ColumnDef(field.getType(), column
                        .value()));
            }
        }

        mForeignFields = Collections.unmodifiableList(foreignFields);
        mColumnFields = Collections.unmodifiableList(columnFields);

        mTableDef = new TableDef(mClass, tableName, primaryKeyDef, uniqueKeyDef,
                foreignKeyDefs, columnDefs);

        validate();

        return this;
    }