private int Recurse(SootMethod currentSootMethod){
		Logger.log("Recurse(" + currentSootMethod +");");

		int ret = 0;
		/**
		 * if the method is not on the stack only then push this method on the stack, or else we may go into a cycle!
		 */
		if(!stack.contains(currentSootMethod)){
			stack.push(currentSootMethod);
			Logger.log("STACK SIZE:"+Integer.toString(stack.size())+", CURRENT STACK:"+stack.toString());
		}else{
			return ret;
		}

		/**
		 * check if we are dealing with a Thread's start method. i.e we need to push start() method 
		 * and translate it to run() method while finding trace-route.
		 */
		// sorry man, too complicated to dwell into, not supporting as of now !
		if("start".equals(currentSootMethod.getName())){
			//TODO-if start method then find the Thread reference on which it was called then get the runnable and then get run() method!

		}



		if(isTargetMethodFound(currentSootMethod)){
			ret = 1;
		} else {
			Iterator<MethodOrMethodContext> targets = new Targets(
					cg.edgesOutOf(currentSootMethod));

			List<SootMethod> filterOutEdges = new ArrayList<SootMethod>();
			while (targets.hasNext()) {
				SootMethod tgt = (SootMethod) targets.next();
				if(isCalledMethodInAllowedPackageList(tgt.getDeclaringClass().getPackageName())){
					filterOutEdges.add(tgt);
					Logger.log("\t\tOUT EDGE="+tgt.getName());
				}
			}
			
			for(SootMethod calledMethod:filterOutEdges){
				int returnVal = Recurse(calledMethod);
				if (returnVal == 1) {
					ret = 1;
					break;
				}
			}
		}
		if(ret == 0) {
			SootMethod popped = stack.pop();
			Logger.log("#POPPED#:"+popped);
		}
		return ret;
	}