void Awake(){
		rows.Add (this);
		if (row == null)
			row = GetComponent<RowHandler2> ();
		if (generator == null)
			generator = GetComponent<RowGenerator> ();
		generator.pattern.Clear ();
		row.target = Camera.main.transform;
		generator.pattern.Add(start_prefab);
		for (int i = 0; i < break_distance; i++) {
			generator.pattern.Add (prefab);
		}
		generator.pattern.Add(end_prefab);
		for (int i = 0; i < break_length; i++) {
			generator.pattern.Add ("");
		}
		state = NamedBehavior.GetOrCreateComponentByName<State> (gameObject, "row");
		generator.on_create((GameObject cell) => {
			StrawberryGenerator sb_generator = cell.GetComponentInChildren<StrawberryGenerator> ();
			if (sb_generator != null){
				sb_generator.state.chain_parent(state);
			}
			DisplaceMesh displace = cell.GetComponentInChildren<DisplaceMesh>();
			displace.construct();
		}).on_destroy((GameObject cell) => {
			StrawberryGenerator sb_generator = cell.GetComponentInChildren<StrawberryGenerator>();
			if (sb_generator != null){
				sb_generator.eject_berries();
			}
		});
	}
	void Start () {
		if (row == null)
			row = GetComponent<RowHandler2> ();
		if (generator == null)
			generator = GetComponent<RowGenerator> ();
		generator.pattern.Clear ();
		row.target = Camera.main.transform;
		generator.pattern.Add (start_prefab);
		for (int i = 0; i < break_distance; i++){
			generator.pattern.Add(prefab);
		}
		generator.pattern.Add (end_prefab);
		for (int i = 0; i < break_length; i++){
			generator.pattern.Add("");
		}
		generator.on_create((cell)=>{
			LeafGenerator leaves = cell.GetComponentInChildren<LeafGenerator>();
			if (leaves != null)
				leaves.Start();
			DisplaceMesh displace = cell.GetComponentInChildren<DisplaceMesh>();
			if (displace != null)
				displace.construct();
		});
	}
	void Awake () {
		if (row == null)
			row = GetComponent<RowHandler2> ();
		create_sub = row.creation.Subscribe ((int ci) => {
			if (pattern.Count > 0){
				string prefab = pattern[wrap(ci, pattern.Count)];
				if (prefab != ""){
					//Debug.Log ("Creating "+prefab+" at "+ci);
					objects[ci] = get_object(prefab);
					objects[ci].SetActive(true);
					objects[ci].transform.position = row.cell_to_pos(ci);
					objects[ci].transform.SetParent(transform,true);
					creation.OnNext(objects[ci]);
					foreach(Action<GameObject> act in create_events){
						act(objects[ci]);
					}
				}
			}
		});
		destroy_sub = row.destruction.Subscribe ((int di) => {
			if (objects.ContainsKey(di)){
				destruction.OnNext(objects[di]);
				foreach(Action<GameObject> act in destroy_events){
					act(objects[di]);
				}
				objects[di].SetActive(false);
				objects.Remove(di);
			}
		});
	}