public function run(array $stack, array $context, Listener $listener) { $stack = array_merge($stack, [$this]); $err = null; $listener->before($stack); try { apply_by_name($this->implementation, $context); } catch (\Exception $err) { // fall through } $listener->after($stack, $err); }