Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:97480 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 10122 invoked from network); 29 Dec 2016 13:12:55 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 29 Dec 2016 13:12:55 -0000 Authentication-Results: pb1.pair.com header.from=mathieu@rochette.cc; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=mathieu@rochette.cc; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain rochette.cc designates 62.210.206.189 as permitted sender) X-PHP-List-Original-Sender: mathieu@rochette.cc X-Host-Fingerprint: 62.210.206.189 texthtml.net Received: from [62.210.206.189] ([62.210.206.189:57965] helo=texthtml.net) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 52/03-04761-4DB05685 for ; Thu, 29 Dec 2016 08:12:53 -0500 Received: by texthtml.net (Postfix, from userid 65534) id BF4C44C6; Thu, 29 Dec 2016 13:12:49 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on a0ff274cda9f X-Spam-Level: X-Spam-Status: No, score=-1.0 required=4.0 tests=ALL_TRUSTED autolearn=ham autolearn_force=no version=3.4.1 Received: from [192.168.1.130] (stunnel_mail_1.mail_default [172.29.0.4]) (Authenticated sender: mathieu@texthtml.net) by texthtml.net (Postfix) with ESMTPA id 4EF244C4 for ; Thu, 29 Dec 2016 13:12:34 +0000 (UTC) To: PHP internals Message-ID: <2aecc3f2-5e9d-907f-029b-5c60eb134b33@rochette.cc> Date: Thu, 29 Dec 2016 14:12:33 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:51.0) Gecko/20100101 Thunderbird/51.0a2 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: en-US Subject: Decorator classes From: mathieu@rochette.cc (Mathieu Rochette) Hello internals, I find that using the decorator pattern is very verbose and maybe something could be done about that, an article[1] I saw proposed a "decorates" keyword to solves this, here is how it might look like in PHP: interface Foo { public bar(); public taz(); } class EchoFooBar decorates Foo { public function bar() { $this->logger->debug("foo bar"); return $this->decorated->bar(); } } class LoggedFooTaz decorates Foo { private $logger; public function __construct(Foo $decorated, Logger $logger) { $this->logger = $logger; $this->decorated = $decorated; } public function taz() { $this->logger->debug("foo taz"); return $this->decorated->taz(); } } * the constructor is optional and default to take the first argument and put it in $decorated * if the constructor is provided PHP check that $decorated is set and implements the decorated interface or class * all public methods not overridden are automatically proxied to the decorated object There is at least a few different ways to go about this, the previous example was just to give you a preview of what it could be. If there is interest I'd like to write an RFC for this :) What do you think about this ? thank you [1] https://dzone.com/articles/is-inheritance-dead