Zavolání rutiny před provedením metody

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Bilbo
Člen | 16
+
0
-

Ahoj, chci se zeptat, zda jde v Nette nějak jednoduše udělat, abych si nastavil určitý kus kódu (rutinu), která se například provede před každou metodou ve třídě (jedná se o přepsání jednoho statického atributu).
Asi bych to zvládnul udělat předefinováním __call() a __callstatic() a pak v nich zavolat funkci parent objektu, ale zajímá mě, jestli na to není nějaké čisté \Nette\Object řešení.
Navíc v prvním případě bych ty metody musel mít nějak spešl označené, když bych je volal, aby se to do magických metod dostalo. Já bych chtěl rovnou volat metody s původním jménem, pouze k tomu nastavit nějaký callback/událost… v tomhle mám pořád trochu zmatek :-)
Díval jsem se dokumentace do části „Rozšíření jazyka PHP“, ale nevím, co z toho bych měl na tohle použít.
Díky moc :-)

Editoval Bilbo (25. 6. 2011 23:33)

mkoubik
Člen | 728
+
0
-

Skus napsat k čemu konkrétně to potřebuješ. Možná se najde jednodušší řešení (metody startup(), beforeRender() apod).

Filip Procházka
Moderator | 4668
+
0
-

No trochu mi to co chceš připomíná Aspektově Orientované Programování, každopádně nevíme jaký typ třídy myslíš (presenter, komponentu, model, …)

Pokud nějaký tvůj model, pak můžeš použít události, ale plně zautomatizovat to nejde, pokud nepoužiješ AOP

class Foo extends Nette\Object
{
	/** @var array */
	public $onCall = array();

	/** @var int */
	public static $prop = 0;


	public function bar()
	{
		$this->onCall($this);
		echo "bar " . self::$prop;
	}


	public function bazRaketak()
	{
		$this->onCall($this);
		echo "baz raketak " . self::$prop;
	}
}

$foo = new Foo;
$foo->onCall[] = function (Foo $foo) { $foo::$prop += 1; };

$foo->bar();
$foo->bazRaketak();