Cytat(mike @ 13.12.2008, 09:38:31 )

Zamiast brnąć z jednych głupich pomysłów w kolejne przepisz to od nowa.
Przecież to co opisujesz to jakiś spaghetti code.
<?php
final class DRA_Loader_Module_Collection extends SDL_Collection
{
/**
* Appends new value
* @param DRA_Loader_Module $module
*/
public function append(DRA_Loader_Module $module)
{
$this->_append($module);
}
/**
* Runs all modules controllers
*/
public function init()
{
foreach($this as $module)
{
/* @var $module DRA_Loader_Module */
if($module->doTrigger())
{
$module->getObject()->init();
$view = $module->getObject()->view();
$model = $module->getObject()->model();
// Check if required objects are correct
if(!is_object($model) || !DRA_Class
::doesImplements($model, array('SDLi_Model'))) {
throw
new Error
('LOADER_MODULE_MODEL_INCORRECT', array('model' => get_class
($model))); }
if(!is_object($view) || !DRA_Class
::doesImplements($view, array('SDLi_View', 'SDLi_Initializable'))) {
throw
new Error
('LOADER_MODULE_VIEW_INCORRECT', array('view' => get_class
($view))); }
$view->init();
// Gather data from Model and assign them to view
$view->assign($model->perform());
// Create new website main frame and assign view output to it
$frame = new DRA_Website_Frame();
$frame->setId(DRA_Website_Frame::CENTER);
$frame->setContent($view->create());
DRA_Engine::website()->frames()->append($frame);
}
}
}
}
?>
Skoro to jest spaghetti code to dlaczego wiesz co tutaj się dzieje bez większego opisywania tego mike?

DRA_Loader pobiera przetworzony url z DRA_Router i w ten sposób ustala klasę kontrolera głównego którą zapisuje w tej kolekcji.
@Morkai: Też myślałem o debug_backtrace ale mam dziwne wrażenie że tego sposobu zastosować nie należy. Tylko cholera jakoś uzasadnienia nie mogę znaleźć. Chyba tylko mogę się podeprzeć spadkiem wydajności. Bo MVC zamierzam stosować też we wtyczkach a co za tym idzie klasę SDL_View implementującą SDLi_View będzie rozszerzać kilka może kilkanaście klas.
p.s. Później sprawdzanie czy kontroler jest 'wywoływalny'
<?php
if($module->doTrigger())
{
?>
, mam zamiar też wprowadzić po uruchomieniu metody init kontrolera.
Celem umożliwienia kontrolerowi zatrzymania wywoływania siebie samego.
edit>
Oczywiście
Morkai za przykład wykorzystania debug_backtrace() zasłużone pomógł.
Swoją drogą może macie jeszcze jakieś inne pomysły na implementację czwartego modyfikatora dostępu external?