package iron;

import iron.object.Object;

class Trait {

	public var name: String = "";

    /**
      Object this trait belongs to.
    **/
	public var object: Object;

	var _add: Array<Void->Void> = null;
	var _init: Array<Void->Void> = null;
	var _remove: Array<Void->Void> = null;
	var _update: Array<Void->Void> = null;
	var _lateUpdate: Array<Void->Void> = null;
	var _render: Array<kha.graphics4.Graphics->Void> = null;
	var _render2D: Array<kha.graphics2.Graphics->Void> = null;

	public function new() {}

    /**
      Remove the trait from the object.
    **/
	public function remove() {
		object.removeTrait(this);
	}

    /**
      Trait is added to an object.
    **/
	public function notifyOnAdd(f: Void->Void) {
		if (_add == null) _add = [];
		_add.push(f);
	}

    /**
      Object which this trait belongs to is added to scene.
    **/
	public function notifyOnInit(f: Void->Void) {
		if (_init == null) _init = [];
		_init.push(f);
		App.notifyOnInit(f);
	}

    /**
      Object which this trait belongs to is removed from scene.
    **/
	public function notifyOnRemove(f: Void->Void) {
		if (_remove == null) _remove = [];
		_remove.push(f);
	}

    /**
      Add game logic handler.
    **/
	public function notifyOnUpdate(f: Void->Void) {
		if (_update == null) _update = [];
		_update.push(f);
		App.notifyOnUpdate(f);
	}

    /**
      Remove game logic handler.
    **/
	public function removeUpdate(f: Void->Void) {
		_update.remove(f);
		App.removeUpdate(f);
	}

    /**
      Add late game logic handler.
    **/
	public function notifyOnLateUpdate(f: Void->Void) {
		if (_lateUpdate == null) _lateUpdate = [];
		_lateUpdate.push(f);
		App.notifyOnLateUpdate(f);
	}

    /**
      Remove late game logic handler.
    **/
	public function removeLateUpdate(f: Void->Void) {
		_lateUpdate.remove(f);
		App.removeLateUpdate(f);
	}

    /**
      Add render handler.
    **/
	public function notifyOnRender(f: kha.graphics4.Graphics->Void) {
		if (_render == null) _render = [];
		_render.push(f);
		App.notifyOnRender(f);
	}

    /**
      Remove render handler.
    **/
	public function removeRender(f: kha.graphics4.Graphics->Void) {
		_render.remove(f);
		App.removeRender(f);
	}

    /**
      Add 2D render handler.
    **/
	public function notifyOnRender2D(f: kha.graphics2.Graphics->Void) {
		if (_render2D == null) _render2D = [];
		_render2D.push(f);
		App.notifyOnRender2D(f);
	}

    /**
      Remove 2D render handler.
    **/
	public function removeRender2D(f: kha.graphics2.Graphics->Void) {
		_render2D.remove(f);
		App.removeRender2D(f);
	}
}