Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:103356 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 42105 invoked from network); 22 Oct 2018 06:43:39 -0000 Received: from unknown (HELO mail-lj1-f177.google.com) (209.85.208.177) by pb1.pair.com with SMTP; 22 Oct 2018 06:43:39 -0000 Received: by mail-lj1-f177.google.com with SMTP id v6-v6so35481148ljc.11 for ; Sun, 21 Oct 2018 19:58:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=uvU+tYPiDutg+IqfNPwK3Y+eQxzyl35fr4qYGZ+3cwc=; b=J6j5LbgNlETHoTB8KRRHkii1aqGRCfz5dRQA0K/RdQYQnkEY5VvrLAqvzeFAVf8kwA IQIjgtZAHufITICE6H1tsDDZU1/y8KxQ6j6KLWgciseVpsXMU5V7eB6LGoTCsVd+epEA IGWHhg1ihdBVxAEG9sFw2BFJS9Ss25q+fYyyMxq5qgzrc61c+T/qZgZWAu2aKuQqZDP6 Vk73KzMHOXhXXhFkC5oAHaGo/Gpee3b5eGe7VxUeN1o3jst7mXc0bn/E8gtRDZAJKOv9 qzr9RR9NXwyexOp7bOrBYkrhCVlQ3EwwVktlcHxm3UprvdQeyhXJk1MwDDCHNNOqq5Fe jUyQ== X-Gm-Message-State: AGRZ1gLeV82fVAa9c0exm33FLkESty7G7vP0VbCZDqYphA9WKvt2Dx7L nxZKOguba/e2kz6slmi2+VNo2UjYi48yyu9IZew= X-Google-Smtp-Source: ACcGV62y6tKhGtoKnl2/OfH/MSr6NddFM9aGtE7kpb2UVBAtn13z94WSbr1nKqhdiUu15o1xxpLkNJl8NDw6U2rs5lE= X-Received: by 2002:a2e:4b11:: with SMTP id y17-v6mr6723687lja.42.1540177090254; Sun, 21 Oct 2018 19:58:10 -0700 (PDT) MIME-Version: 1.0 References: <0047f3c7-3e9e-ef6f-2d7a-e58c316ea751@gmail.com> In-Reply-To: <0047f3c7-3e9e-ef6f-2d7a-e58c316ea751@gmail.com> Date: Sun, 21 Oct 2018 20:57:50 -0600 Message-ID: To: Rowan Collins Cc: internals Content-Type: text/plain; charset="UTF-8" Subject: Re: [PHP-DEV] Composition over inheritance: native support for "delegating" methods? From: levim@php.net (Levi Morrison) I have wanted something like this before. I used a trait helper. This worked for this domain because there is an interface that is well established for the helper to use. Here's an example (written in my email client, untested): trait OuterIteratorHelper { abstract function getInnerIterator(): \Iterator; function rewind(): void { $this->getInnerIterator()->rewind(); } function valid(): bool { return $this->getInnerIterator()->valid(); } function next(): void { $this->getInnerIterator()->next(); } function key() { return $this->getInnerIterator()->key(); } function current() { return $this->getInnerIterator()->current(); } } final class TransformIterator implements \OuterIterator { private $transformer, $inner; function __construct(callable $transformer, \Iterator $inner) { $this->transformer = $transformer; $this->inner = $inner; } use OuterIteratorHelper; function getInnerIterator() { return $this->inner; } function current() { return ($this->transformer)($this->inner->current()); } }