Reads file and compiles it with compiler. Data is cached
function(callback,compilationSource){
		if( compilationSource && this.cache.compilationSource && this.cache.compilationSource === compilationSource ) return;
		var callbackError=function(type,strOrErr){
			/*if(strOrErr instanceof Array){
				var i,finalStr='Errors :';
				for(i in strOrErr){
					console.error(strOrErr[i].stack);
					finalStr+=+"\n"+strOrErr[i].toString().slice(7);
				}
				strOrErr=finalStr;
			}*/
			//var error=new Error(strOrErr instanceof Error ? strOrErr.toString().slice(7) : strOrErr);
			var error=strOrErr instanceof Error ? strOrErr : new Error(strOrErr);
			error._Type=type;
			t.cache.error=error;
			callback(error);
		},t=this;
		
		if(t.compiler){
			(t.compiler.read||function(path,callback){
				fs.readFile(t.srcPath,function(err,buffer){
					if(err) return callback(err);
					callback(null,buffer.toString());
				});
			})(t.srcPath,function(err,fileContent){
				if(err) return callbackError('Reading',err);
				t.lint(t,fileContent,function(err){
					if(err) return callbackError('Linting',err);
					
					t.parse(fileContent,function(err,data){
						if(err) return callbackError('Parsing',err);
						try{
							t._compile(data,function(err,results,dependencies){
								if(err) return callbackError('Compiling',err);
								if(err===false) return callback();
								t.optimize(t,results,function(err,optimizedResults){
									if(err) return callbackError('Optimizing',err);
									t.cache.error=null;
									t.cache.compilationTime=Date.now();
									t.cache.compilationSource=compilationSource;
									if(err===false){
										t.cache.dependencies=null;
										return callback();
									}
									t.cache.dependencies=!dependencies || dependencies.app ? dependencies : {app:dependencies};
									t.write(optimizedResults,callback);
								});
							});
						}catch(err){
							return callbackError('Compiling',err);
						}
					});
				});
			});
		}else{
			t.copy(callback);
		}
	}