Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:126754 X-Original-To: internals@lists.php.net Delivered-To: internals@lists.php.net Received: from php-smtp4.php.net (php-smtp4.php.net [45.112.84.5]) by qa.php.net (Postfix) with ESMTPS id 486751A00BC for ; Fri, 14 Mar 2025 15:00:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=php.net; s=mail; t=1741964303; bh=K6j6BATiczmdjg6q4bYjLOUFBN9PWnRtL5rmmL+ScV0=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=BfxpLTzfCIa9PqcNKUQUiDry1yKD5AqpGy9Cxy+w8twJgOqsmgQDS+FYX5TyOP6l+ EOAG+ZE0vapxVSkWfnJojGJliAPlp3qpsJV57LW4t5cyZKVLO0MLit7pj0wOyEMi9m B7372h7gjSOXmhknmCDvb9fUBzusQYL6u1XqeaZxcT+MtutbmEpvd0g+7tvmJaB8Iw YweWwZMSKtUp8KgAHabgP1Lq0ar7uMZgAQLBxKVVQ6t/G/U37s69isc9G2yZ9Ei3OX sR3VW5GktgbxxTYZ2oesKi0b/x1KW8/twzsGc0odAauwSCVP5FH8h2tfszqQwis0CO zcpjwYf83UUyA== Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 2957F180072 for ; Fri, 14 Mar 2025 14:58:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.0 (2022-12-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-3.6 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,DMARC_PASS, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,HTML_MESSAGE, RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS autolearn=no autolearn_force=no version=4.0.0 X-Spam-Virus: No X-Envelope-From: Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02olkn2037.outbound.protection.outlook.com [40.92.49.37]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (secp384r1) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Fri, 14 Mar 2025 14:58:21 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XsumVoiMy+Tds9W1wjyKCG02lInYycHMEE3WVQJMOmkdXOZInGsl8a7ryTYt8s1PTfkqxnnWQaa3o7G7ECQPspsDfp6qVQ/nEYp4Kvm2ywBBnyrtyYhKFNathpavkC8tctkWsgrShdQUMoanzvJwqBkc6QnPr9LYzALuEH+QyXI+ARzAGD2k1BZgBvsf08wtekfzYB7mCJhhlurOR9kKdmlwjN9Mkom02x2/GYYHfq9/9PtvN5/XkSqQ6nmy0ndzFcbbbKVNMmyQUVggLsZqveerGqcaBgu046/pA44qHtP4R+3+qD5Zi+5Al5jmm2RAzpLd6+smGKSHsY7/vx+KYw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Towswas6y+W43u8FdplquXtU4QyV8MjdRyI3bb+JB3I=; b=kG29coqE1Lt7qycn16kRrs6jUM69IRmxZucREjDh8Qz2MOx4YFYRne1EmHdFdKpm9b/xGeEFUDFv9qSLG9nPTqQP0mNqXK8/Rl2Ovi4MrtbgH8DVB9Bg9KBIU29/ZLrDEXFqXbC4WCFs8InD5xdkQPdPfcZs4fGd3eQrJdMTASRpW7NImj3rLWpUoiaJcokOzNRR9CJ9zlhi8zuEMXV2S5K+Cjua5hPkGlW4ML6dLTF9evzXU302LvB5F1R2hb12tG6pKi0E376lwVYYNUYqc3KbY3FCf3E05mindf7sfJA3/vGtE7VnY3hTvuk/HlCtiKwY2TpKZkcGZrXtEaiqSw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Towswas6y+W43u8FdplquXtU4QyV8MjdRyI3bb+JB3I=; b=So/lGqdtRmZme6cH8Etm1VXNP9l8b8dFFWYlMVWMpGHcL8oEClLbqmDMimR3wbiJ1yeZJP9rTxVRc3rTcbwKy9aWc9llOxdzbN6dclzedFw74eAUcNif6kXfAyELxFvQYXU6qto7/8bzsEfO1ZJX3akC2Q26HzVfMyR8IJlp3gN+59O+cDjwJweoYgPGnKzzlEDUiKGfskal+5qKEvw4cdkrCPBXNMkUDq3Rty8FyV1Mne2yTrDI1lwrDRw8+uby/tdBrom7/8o89xLzKjEDdbsmrpIUUh44XrZLGBD2HeeQkwAVllOrZEx5jjYHb8SZNyAMmYrMrvRfxo1q1v9gyg== Received: from AM8P250MB0170.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:321::21) by PRAP250MB0710.EURP250.PROD.OUTLOOK.COM (2603:10a6:102:29c::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8511.27; Fri, 14 Mar 2025 15:00:51 +0000 Received: from AM8P250MB0170.EURP250.PROD.OUTLOOK.COM ([fe80::651e:bbd2:b18a:80ff]) by AM8P250MB0170.EURP250.PROD.OUTLOOK.COM ([fe80::651e:bbd2:b18a:80ff%3]) with mapi id 15.20.8534.027; Fri, 14 Mar 2025 15:00:51 +0000 Content-Type: multipart/alternative; boundary="------------AmK4meSegEcPDxDKE8CMXKzx" Message-ID: Date: Fri, 14 Mar 2025 16:00:51 +0100 User-Agent: Mozilla Thunderbird Subject: Re: [PHP-DEV] [RFC] [Discussion] Optional interfaces To: "Gina P. Banyard" , Juris Evertovskis Cc: 'php internals' References: <087a01db596a$e7525660$b5f70320$@glaive.pro> <045501db7b37$e1f15970$a5d40c50$@glaive.pro> <038601db8d48$5dfb65c0$19f23140$@glaive.pro> <049101db92a3$e015a100$a040e300$@glaive.pro> Content-Language: en-US In-Reply-To: X-ClientProxiedBy: FR0P281CA0113.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a8::13) To AM8P250MB0170.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:321::21) X-Microsoft-Original-Message-ID: <31154297-bbf9-466e-81fc-e172678dbdad@hotmail.com> Precedence: bulk list-help: list-post: List-Id: internals.lists.php.net x-ms-reactions: disallow MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM8P250MB0170:EE_|PRAP250MB0710:EE_ X-MS-Office365-Filtering-Correlation-Id: cb59cae9-0ea6-4809-d1ce-08dd63090300 X-Microsoft-Antispam: BCL:0;ARA:14566002|9400799030|12121999004|15080799006|8060799006|5072599009|461199028|8022599003|12050799009|7092599003|19110799003|10035399004|440099028|3412199025|4302099013|1602099012; X-Microsoft-Antispam-Message-Info: =?utf-8?B?MlNJZXZEdlJuODBsVW93bEdFL0dOTWEwV3U1RTluUExWTFU4QVYrVm5vUmU1?= =?utf-8?B?NEdic0NVWXNVZGFIUUFEMmhjQjVLMmZZOWxicVdJTUxXbjY5UGdPVW9VVXRp?= =?utf-8?B?WFI1RDcxQlNHQ2lDQjY4T3FCaGFoUEw1SDdNZXJzT3JlQ2lVRHBoSm1CRkF4?= =?utf-8?B?eVU0OVltQ2FUbEI4cWlsZ2RSTXBteUpCNzA3V2JpRllVV21YMXdYTDNjbDJK?= =?utf-8?B?M0NUUU1va1lGVDhkU2ppR1ZUSStVS2VjQTZjdE45MklUMGFqdlJORm41NFhz?= =?utf-8?B?amJ5RERvejlTSTg2UHlEdjM2VGw5OTVxU1VLQzNQckRYZ3ppY09SUDVnTlQy?= =?utf-8?B?OTFNYWhnQlZSRWRHZWY2NEx6cjh2ZTVQS1Q0cG91ZFEralhJWFNiVHhSRkZU?= =?utf-8?B?czVkODk1Q1ExQ2NQaUlZTFFVbDZNODJIcldCc055anIyc3JqemRTNk40UU1q?= =?utf-8?B?Vk04QjRKMmRma2tFaS9VZ0krUHpZOFB1eDlQeEdpaU9aM2Z5NWgrUE9HU2R4?= =?utf-8?B?VVRYZHBPT2ZuQyt1Ylk0S3czajNCc01WUmJqUzNiTENyUmExdnlpckRiNzlr?= =?utf-8?B?ZnVEa25IaW9OcER1UnZ4QkloZFZIajJJeVBuODZYNXR3Q0tnNUNNcjl4bTR1?= =?utf-8?B?NGtFRnJpN2cxQXJFMDBpSm54VjBtaEs2VFlCdzUrY1dsYUdJdG1XTFM2QUpL?= =?utf-8?B?Ujh3dFh3R3JTQ0xpL2NoeFhIeDFDZjZmSDQzOGhVQkV3UFp0WWlkZ29YcTNU?= =?utf-8?B?ZWo5T2c3Qm5FbE5XbE1QZUk0c1lsUjFTcmFQNERLOWlkTjRCTkdvWVZudmM2?= =?utf-8?B?NHV2RHF0OHFvTUQ1UkRyLzhITkM1T3F5YWNsUC9WTmdzb1ZFaUYwbUFvYzVB?= =?utf-8?B?ckhkcDRmOGFGYkdpL0hlY0N5QUE1N3JVSEhva0pQREtIWlJVc0t5OVM3RHZ5?= =?utf-8?B?dlVCRHJ6V2daSmRqZDQ2WHZLU004VUZsWWh5SUU3cnVLV1g0Y3I3L0tZMHpq?= =?utf-8?B?V05BaENISEFHVkp2T0U5amx0ZzhlQWdEUjRKQm42ekRMTVUyZ0NiOEx6dklW?= =?utf-8?B?eVVJUGpqd3NzcmMxRFlsWFVpUHlpYmhJVi81WFF6akgySUU5YjlIcEJZcmlS?= =?utf-8?B?RWxrcGpSU2hrYmpXeG96VVNIbmNHMXMvWU1Yb0dnbDEvMHBpWElITjZFU0Fk?= =?utf-8?B?ajRRTjhYTEJGWEVXQ0ZMY3cxd0pwZnc2MW9UQTRRZmxEbGhYbm12dUVsckIr?= =?utf-8?B?WnpuZklzM3JyUTRRcXUvbXMxZWhrMXg4MjlLSWJWdjFlSGovVWd2eFhRYkwx?= =?utf-8?B?OWhSZkl0QUhycFB5SDNuVHVWcHBTclNpOXNMQ21YUnU0THdWVXVQM01ZelpC?= =?utf-8?B?SW5NRVRUSlhoQmpTQitCZkw3ckpjQzQwU1BUdGxBWk1UdVRydFFBQnNQSFBQ?= =?utf-8?B?eTZNMkx6RURmNTN3eVFOVXNhU01Ic1VvWGVTNFUvbzduYlN1K1ZycE9xRlRN?= =?utf-8?B?Y2xEY00ydjU2T2l0bTdRM1ZTbDU4NnlHOUpRWWpBZ1c1YmNEMTQvcHJEMVJr?= =?utf-8?B?VXh4YStVYjQ0UmZNNnByc25Xb2RKa09mL3VOdUJRdVFiN3BQTU1kbTlCUGYx?= =?utf-8?B?ZWhoMUVRSzI5cHRjN2F1bkhKU0VsQ3FCcTlKUnM4ODYwdm1nbTdMQ0xVR1FG?= =?utf-8?B?cVpJOFhIVmtQUmcxcUk1aHFlNE40QzYwS2tHZmFLTmdsUUxEV2pPdEFZcllH?= =?utf-8?B?NDBnYkNUa0cvTk16R0YvMGdLTzVNdFRiSmhycDFzQ1NBVy81TDd1eVphQVNv?= =?utf-8?Q?cisG4ie90Rl5mT26g1JZzansVUy8tDCY1a/OI=3D?= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?amJjUGZtTk5YbWRJWEFicFByUDNsUzl3N1lpNG5uVzNmOHpHQ1IvdkhNTEVh?= =?utf-8?B?UlgycUREWEVkUi9ObVFhZHU1djJCb0ZqZmJOTGx3elVUSzVVbVp4SGtEQ05F?= =?utf-8?B?QkVqWDJ3enYrLzk3MkxmOXgwN2Z4RFkrQTd4QVV1Ui9paFFYTUtqSy91ZEYw?= =?utf-8?B?NDJHeVNxWFJQVGZoSFc3K1pFT0F1T3JRaWVSM2g1N0lSaHArZlphNlUwZUIz?= =?utf-8?B?cUozZHZjS01XRTNMN2UvNDM5d0ROQkNUcVllYmlnbkRzaDVOQ2hhMkFYZGN3?= =?utf-8?B?Y2FYbFlVcXVaZXpwM3pJSnMxRkM4K2ZiYTNza0IrcFY0WmZuYitnV1EzajZK?= =?utf-8?B?T1BlY25NTGlBc1FIcFRDRHRteExFTXBvTVlmMXVXS2gzdkt1OHZsM1o3a3Jr?= =?utf-8?B?REU4MXNvb2FQWE1hcXJFUjlxaEtHR0JxRDAxSWRHalFKT3hLL0ptNVBmblp6?= =?utf-8?B?MWE4bnZrbHQ5NXRCaG9sc2FOK2VXb0c1dlRlVDhNcEpINEZtN240RDJncDlW?= =?utf-8?B?MFFhTy9PNmNaYUxUdXRseWVsUUhTQ2JFM2s3M3llOXdKZnVGS1BhM2wvd0Zo?= =?utf-8?B?MFcrTXdMT0pYYU5PTllIazNxeVdBR1FTMmt2RUhWU0QzZnVUbXFnQnVEUTFI?= =?utf-8?B?WURSdWdHb2I1K2xGVGlxekRFRTFYaFp2bzQ5RWM0U3J2a2VxTGlOdklIbGU0?= =?utf-8?B?Mis2ZUFiTDhERXI3YWNqb1B2YjN2amVWZXRWWExRUGRZWXNBR2oxNUxpMFo0?= =?utf-8?B?TDhkOEtJUFNaTVM5ejRNODlBbHRNa2JIKzEzUmFBVmtSVWIrTXZNOFlWVlJY?= =?utf-8?B?Z1JCek4xekJtWlkrM0U5bUtRZlNwWWw0aDRyRElxWHNTNG8zck1LZWhPVnR2?= =?utf-8?B?YllHMTBxQWVNcURZNk5aNFVVcnFGc1RzRGdtZmFWYU11UVVnNFUzZlhVRnNz?= =?utf-8?B?UHcrV3pPRnpITHlNUFVCdTlscDlHVU5jR1prSXcwSGxkeW85RkM3ZFAvYXp5?= =?utf-8?B?T21UUTdMcnRmdHh0bkErZk1zL0Q2Tld6YVkwWXRodXRCdVMvZGJRV2xVSnFQ?= =?utf-8?B?ZTZySWxEUTRNbGxtTUY0U3JTb1BLbVcvWmVaWlRWS0tJbEpNQTZhbnI0Z3lN?= =?utf-8?B?WEJXZ1ZOclBBeHRxbm5xdEpLL2xESWdOQkRkSjh4WEZrWlpuQ2sxUlVqNTFO?= =?utf-8?B?TjRBTWZvWXl0SkdOQUVDSnBJMGwrV01HZE1HTlNLSC9PTzRzejVaTlo1bmFE?= =?utf-8?B?b21lSHkrTFlJVStjTnJUeE1lTXdZWXZMRlVkL21sQVhxM2g1QnVOdDRUaFdV?= =?utf-8?B?NFFkbnJGN1I5S28vTFp0VnU2emZ6bjM4akEwSDJGWWdhTnZ4Z2V6bHhaR3hz?= =?utf-8?B?a3VYZUZLVWRkTGNvQ1d1bXZCa0MxMmIwWFRVQVlkSFR1MUxmODdNeW5HYUds?= =?utf-8?B?N1RQN0VsaFhONWtsN3pmOFVQU1lRWjhCMXlYb1U4c1RVL0hTR0ZwbGIzM3Zm?= =?utf-8?B?S0JrS29TTE1DMWpzaWVtam5KQ20wbmhWd3JLMXRXV2dsUDJQeXUxdnNtb25w?= =?utf-8?B?QzJHWTlqcEtuUlcwalhCdStjNEpXZTJFcTJWckUyTDV1Y3NGd1pIUzdjSXV4?= =?utf-8?B?MmpxM1ZtL3M5R2V5eUJsUmc1MHJlaHpONnZGMCtZMzFxNXE3cG9xK3ZlSTZF?= =?utf-8?B?UDNwTmw4MGdKbWZwUlVRTjk0cDVWZ2J3eW9MbklrenI1YythMVhJcVF1S1Rj?= =?utf-8?Q?mqKO9HezkE2fybielc=3D?= X-OriginatorOrg: sct-15-20-7784-11-msonline-outlook-95b76.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: cb59cae9-0ea6-4809-d1ce-08dd63090300 X-MS-Exchange-CrossTenant-AuthSource: AM8P250MB0170.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Mar 2025 15:00:51.6137 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: PRAP250MB0710 From: bobwei9@hotmail.com (Bob Weinand) --------------AmK4meSegEcPDxDKE8CMXKzx Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hey Gina, On 12.3.2025 06:16:15, Gina P. Banyard wrote: > On Tuesday, 11 March 2025 at 16:37, Juris Evertovskis > wrote: >> >> Hey, >> >> Just a headsup that I plan to start the vote in a couple of days. >> Please let me know if there are concerns that might affect your >> stance on this proposal. >> >> https://wiki.php.net/rfc/optional-interfaces >> > > I will be voting against this. > > I understand why you might want this, but this seems to be a very > niche requirement and messing with type level guarantees is not > something I want to see. > The RFCs implies that any invalid code will be caught at compile time, > but this is not true. I'd assume you'd require-dev all your dependencies and see the issues at compile time. > If the optional dependency is never present, you can violate the > interface in whatever way you want, which you might not be doing on > purpose. > Moreover, this also does not help if an optional dependency changes > the requirements of their interface and is present, so you would still > need to do those "hacky" workarounds. > (e.g. if a dependency changes how they define the interface in a major > release) That's what version requirements are for in composer. Similarly, if a major release is released, you just implement the methods defined on the interface for all major versions you support. This does not need the hacky workarounds in any way. > > The fact an interface can become "available" at a later stage and > classes defined prior to it being available having an optional > dependency on it not implementing it is bound to be weird and unintuitive. This is not more or less intuitive than the current workarounds you'll have to do with "if (class_exists('interfacename'))". > > And ultimately, this does not  really solve the problem of supporting > optional dependencies, or using your object in ways that are > compatible with another dependency. > Because it still relies on a library/framework/whatever maintainer to > add, possibly infinite, optional interfaces for any new optional > dependency which might want to interact with instances of your classes. It does not and it does not need to. That's a wholly different feature (e.g. "when class X is declared, auto-attach trait Y and implement Z") or similar. But that doesn't preclude me from wanting to support various external libraries out-of-the box without manual interaction of the users. Which is what this RFC solves. > As such I would prefer something which is more similar to type classes > ("add type information outside of your class declaration"). > Or even explicit runtime interface implementation which could for > example look like: > >     $obj implements OptionalDependency; >     someFunctionFromOptionalDependency($obj); > > which gives control to the *user* where and how class instance may > interact with dependencies that are outside of your control, and that > you don't even need to care of. > > Best regards, > > Gina P. Banyard Bob --------------AmK4meSegEcPDxDKE8CMXKzx Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hey Gina,

On 12.3.2025 06:16:15, Gina P. Banyard wrote:
On Tuesday, 11 March 2025 at 16:37, Juris Evertovskis <juris@glaive.pro> wrote:

Hey,

 

Just a headsup that I plan to start the vote in a couple of days. Please let me know if there are concerns that might affect your stance on this proposal.

 

https://wiki.php.net/rfc/optional-interfaces


I will be voting against this.

I understand why you might want this, but this seems to be a very niche requirement and messing with type level guarantees is not something I want to see.
The RFCs implies that any invalid code will be caught at compile time, but this is not true.
I'd assume you'd require-dev all your dependencies and see the issues at compile time.
If the optional dependency is never present, you can violate the interface in whatever way you want, which you might not be doing on purpose.
Moreover, this also does not help if an optional dependency changes the requirements of their interface and is present, so you would still need to do those "hacky" workarounds.
(e.g. if a dependency changes how they define the interface in a major release)
That's what version requirements are for in composer. Similarly, if a major release is released, you just implement the methods defined on the interface for all major versions you support. This does not need the hacky workarounds in any way.

The fact an interface can become "available" at a later stage and classes defined prior to it being available having an optional dependency on it not implementing it is bound to be weird and unintuitive.
This is not more or less intuitive than the current workarounds you'll have to do with "if (class_exists('interfacename'))".

And ultimately, this does not  really solve the problem of supporting optional dependencies, or using your object in ways that are compatible with another dependency.
Because it still relies on a library/framework/whatever maintainer to add, possibly infinite, optional interfaces for any new optional dependency which might want to interact with instances of your classes.

It does not and it does not need to. That's a wholly different feature (e.g. "when class X is declared, auto-attach trait Y and implement Z") or similar.

But that doesn't preclude me from wanting to support various external libraries out-of-the box without manual interaction of the users. Which is what this RFC solves.

As such I would prefer something which is more similar to type classes ("add type information outside of your class declaration").
Or even explicit runtime interface implementation which could for example look like:

    $obj implements OptionalDependency;
    someFunctionFromOptionalDependency($obj);

which gives control to the *user* where and how class instance may interact with dependencies that are outside of your control, and that you don't even need to care of.

Best regards,

Gina P. Banyard


Bob

--------------AmK4meSegEcPDxDKE8CMXKzx--