// Path: src/src/com/orm/androrm/field/DataField.java
// public abstract class DataField<T> implements DatabaseField<T> {
// 	
// 	/**
// 	 * Type descriptor of this field used for the 
// 	 * database definition.
// 	 */
// 	protected String mType;
// 	/**
// 	 * Value of that field. 
// 	 */
// 	protected T mValue;
// 	/**
// 	 * Maximum length of that field.
// 	 */
// 	protected int mMaxLength;
// 	
// 	@Override
// 	public T get() {
// 		return mValue;
// 	}
// 	
// 	@Override
// 	public String getDefinition(String fieldName) {
// 		String definition = "`" + fieldName + "` " + mType;
// 		
// 		if(mMaxLength > 0) {
// 			definition += "(" + mMaxLength + ")";
// 		}
// 		
// 		return definition;
// 	}
// 	
// 	@Override
// 	public void set(T value) {
// 		mValue = value;
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		return String.valueOf(mValue);
// 	}
// 	
// 	protected boolean exec(Context context, Class<? extends Model> model, String sql) {
// 		DatabaseAdapter adapter = DatabaseAdapter.getInstance(context);
// 		
// 		adapter.open();
// 		
// 		try {
// 			adapter.exec(sql);
// 		} catch(SQLException e) {
// 			adapter.close();
// 		
// 			return false;
// 		}
// 		
// 		adapter.close();
// 		return true;
// 	}
// 	
// 	public boolean addToAs(Context context, Class<? extends Model> model, String name) {
// 		String sql = "ALTER TABLE `" + DatabaseBuilder.getTableName(model) + "` "
// 					+ "ADD COLUMN " + getDefinition(name);
// 		
// 		return exec(context, model, sql);
// 				
// 	}
// }
// 
// Path: src/src/com/orm/androrm/field/OneToManyField.java
// public class OneToManyField<L extends Model, 
// 							R extends Model> 
// extends AbstractToManyRelation<L, R> {
// 
// 	public OneToManyField(Class<L> origin, Class<R> target) {
// 		mOriginClass = origin;
// 		mTargetClass = target;
// 		mValues = new ArrayList<R>();
// 	}
// 	
// 	@Override
// 	public QuerySet<R> get(Context context, L origin) {
// 		String fieldName = Model.getBackLinkFieldName(mTargetClass, mOriginClass);
// 		
// 		Filter filter = new Filter();
// 		filter.is(fieldName, origin);
// 		
// 		QuerySet<R> querySet = new QuerySet<R>(context, mTargetClass);
// 		querySet.filter(filter);
// 		
// 		return querySet;
// 	}
// }


import com.orm.androrm.field.OneToManyField;
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import com.orm.androrm.field.DataField;
import com.orm.androrm.field.ForeignKeyField;
import com.orm.androrm.field.ManyToManyField;
					definitions.addAll(getRelationDefinitions(c));
				}
				
				ModelCache.setTableDefinitions(clazz, definitions);
				
				return definitions;
			} catch(IllegalAccessException e) {
				Log.e(TAG, "an exception has been thrown while gathering the database structure information.", e);
			}
		}
		
		return null;
	}
	
	private static final<T extends Model> void getFieldDefinitions(
			
			T 				instance, 
			Class<T> 		clazz, 
			TableDefinition modelTable
			
	) throws IllegalArgumentException, IllegalAccessException {
		
		if(clazz != null && clazz.isInstance(instance)) {
			ModelCache.addModel(clazz);
			
			for(Field field: getFields(clazz, instance)) {
				String name = field.getName();

				Object o = field.get(instance);
				
// Path: src/src/com/orm/androrm/field/DataField.java
// public abstract class DataField<T> implements DatabaseField<T> {
// 	
// 	/**
// 	 * Type descriptor of this field used for the 
// 	 * database definition.
// 	 */
// 	protected String mType;
// 	/**
// 	 * Value of that field. 
// 	 */
// 	protected T mValue;
// 	/**
// 	 * Maximum length of that field.
// 	 */
// 	protected int mMaxLength;
// 	
// 	@Override
// 	public T get() {
// 		return mValue;
// 	}
// 	
// 	@Override
// 	public String getDefinition(String fieldName) {
// 		String definition = "`" + fieldName + "` " + mType;
// 		
// 		if(mMaxLength > 0) {
// 			definition += "(" + mMaxLength + ")";
// 		}
// 		
// 		return definition;
// 	}
// 	
// 	@Override
// 	public void set(T value) {
// 		mValue = value;
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		return String.valueOf(mValue);
// 	}
// 	
// 	protected boolean exec(Context context, Class<? extends Model> model, String sql) {
// 		DatabaseAdapter adapter = DatabaseAdapter.getInstance(context);
// 		
// 		adapter.open();
// 		
// 		try {
// 			adapter.exec(sql);
// 		} catch(SQLException e) {
// 			adapter.close();
// 		
// 			return false;
// 		}
// 		
// 		adapter.close();
// 		return true;
// 	}
// 	
// 	public boolean addToAs(Context context, Class<? extends Model> model, String name) {
// 		String sql = "ALTER TABLE `" + DatabaseBuilder.getTableName(model) + "` "
// 					+ "ADD COLUMN " + getDefinition(name);
// 		
// 		return exec(context, model, sql);
// 				
// 	}
// }
// 
// Path: src/src/com/orm/androrm/field/OneToManyField.java
// public class OneToManyField<L extends Model, 
// 							R extends Model> 
// extends AbstractToManyRelation<L, R> {
// 
// 	public OneToManyField(Class<L> origin, Class<R> target) {
// 		mOriginClass = origin;
// 		mTargetClass = target;
// 		mValues = new ArrayList<R>();
// 	}
// 	
// 	@Override
// 	public QuerySet<R> get(Context context, L origin) {
// 		String fieldName = Model.getBackLinkFieldName(mTargetClass, mOriginClass);
// 		
// 		Filter filter = new Filter();
// 		filter.is(fieldName, origin);
// 		
// 		QuerySet<R> querySet = new QuerySet<R>(context, mTargetClass);
// 		querySet.filter(filter);
// 		
// 		return querySet;
// 	}
// }


// Path: src/src/com/orm/androrm/DatabaseBuilder.java
import com.orm.androrm.field.OneToManyField;
import android.util.Log;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import com.orm.androrm.field.DataField;
import com.orm.androrm.field.ForeignKeyField;
import com.orm.androrm.field.ManyToManyField;

					definitions.addAll(getRelationDefinitions(c));
				}
				
				ModelCache.setTableDefinitions(clazz, definitions);
				
				return definitions;
			} catch(IllegalAccessException e) {
				Log.e(TAG, "an exception has been thrown while gathering the database structure information.", e);
			}
		}
		
		return null;
	}
	
	private static final<T extends Model> void getFieldDefinitions(
			
			T 				instance, 
			Class<T> 		clazz, 
			TableDefinition modelTable
			
	) throws IllegalArgumentException, IllegalAccessException {
		
		if(clazz != null && clazz.isInstance(instance)) {
			ModelCache.addModel(clazz);
			
			for(Field field: getFields(clazz, instance)) {
				String name = field.getName();

				Object o = field.get(instance);
				
				if(o instanceof DataField) {