Edit: I apologize for letting this question drift away for more than a month and shirking my responsibility of adding examples and answering questions. It was, partly, just base slothfulness.
Continuing in the same vein as the original post, this is how the three tiers roughly look like (simplified as much as possible, almost identical to above):
abstract class BaseWidget extends \Illuminate\Routing\Controller { private function getPath($file) { $name = return get_called_class(); //Uses get_class_name $file = $some_base_path . '/' . $name . '/'; if(file_exists($file)) { return $file; } else { $refl = new \ReflectionObject($this); $parentRefl = $refl->getParentClass(); $methodRefl = $parentRefl->getMethod('getPath'); $methodRefl->setAccessible(true); $path = $methodRefl->invoke($this); return $path; } } } class Widget extends BaseWidget { //This guy resides in App/Widgets/Widget/Widget.php, //and has a view in Widget/Views/View.blade.php //When $widget->getPath('Views/View.blade.php') is called, //it will know how to 'find itself' and where to look for its own //view } class SpecialisedWidget extends Widget { //This guy resides in ...Widgets\SpecialisedWidget.php //Its 'views' folder is empty, so when it has to find it, //it will instead borrow it from its parent. If this class //also had a child with no view, it would go up to Widget on the //inheritance chain. } I recognise that I am using inheritance to do something which inheritance is not supposed to do. However, the functionality which I had to implement - A Widget borrowing views from its parent, which are relative to the parent's location on disk - whereof the child is unaware - necessitated that I cheat just a little bit.