Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:130051 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 lists.php.net (Postfix) with ESMTPS id 733541A00BC for ; Sat, 7 Feb 2026 16:51:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=php.net; s=mail; t=1770483101; bh=9Ou0tL6D3v/Zr6f7jpD+7uIK6JroeYU7d1ArRJarHQk=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=RexLee7KPZPVouN/sLA4mIPagSwDkPGk7CaqrgzezkVO7oO5s369o+EP6fjL7u1sb SdDdzPxi1j+cyOowkLv1lBbH1K8LJs4h99WZdc/uG7D8q5PI44a8VrnKsU8nyuYWPl aWUzHGLtYFBs8eEjMJNGdEfGcWxVO3NqFMzOb5gxvA/iUSrzrwLDzYigcjmk9yhEkY 5l6PAmfsvWV1vWm9mfLK2zSFsfSia9ruQiLPlBQEw/63RodeTXKz9KFoNYqy7a8PiH MK80sD2rPgBcF+u4VnLCWCELHIuIAyUV9NyIz+JTl9GUGvuXOLwdfDbAX0MfZWnIsW 30HJULVqTbrhw== Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 25DC8180084 for ; Sat, 7 Feb 2026 16:51:40 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=0.9 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_50, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,DMARC_PASS, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,RCVD_IN_MSPIKE_H2, SPF_HELO_PASS,SPF_PASS autolearn=no autolearn_force=no version=4.0.1 X-Spam-Virus: No X-Envelope-From: Received: from MRWPR03CU001.outbound.protection.outlook.com (mail-francesouthazolkn19011028.outbound.protection.outlook.com [52.103.39.28]) (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 ; Sat, 7 Feb 2026 16:51:39 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=J+N5S+wt0UIXGQpe1FOAtP5f0h7akYiLagpHqrc00r5MFYIzcPLRrSPL4R8AU+wlbHNDt/FDeqAHeQnYCkWGzVR9SDYjSEvP6/K4+onud2RKT3cCJOLk7nKOXh4PtetZPTmyooEk4oOumrKo26y4QREx1PPWK+K8fzOxxApAU+p8ymIqvV6JwcniV3VcGMAISUcz+twsrCvCO+xYtlvVr6VTiegnObfddYaygUwZ9QourOuPZ2R7yXeVSbdXaQP8liRKJRJmu0Fd8kw8zs7y3c6XQ+e9iLtedv2gQBktd2nUzy1Rrs2btFyxy9PAvDesqOte7Ol9H8yrYcpesQdokA== 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=tdXRZ8acqkpwTvl42F/OJkbJnatmiXMt5Z7rLpc04Ys=; b=wAvtPsxgMLoBO+x734KGACXRiZ08qYQ7TJw+CuD+YBoyueL9lbu1h/3PYARDGKRp/r7oiMq1gd2/wy4HRYsnut3ZVtYx6eQ2Sx9iM59z4E9YNswuUhxYvCjhq5gQf0B/Cbf/CcVirW4KFf+54K9DV+39jGnCg1++WFYWO2z/NypqaKUqITQRdowHgzXMVOvPtvOPQ+3FOAxP3rwJ+mBd78QCZKMCLGkq3JyGe8STuGGHBFKY6yp4AMST0HmyeZGqN+WH/tIkc/xk4rYCtAciGpweDvFK3Nt+q4fOAyHWEMHXZ2oKueztS3WsNR10AiRamRrGlPBKrEeP/ahlB58WHQ== 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=tdXRZ8acqkpwTvl42F/OJkbJnatmiXMt5Z7rLpc04Ys=; b=BcGdgcNbR77XAHL1f+KjRwk7pfyPB1+FKSKlkAAOs7tpKfJs1+L+An6cBYUOQdc6BrSzV282HtTMwoa6X1aVjdw9akm6ee/9NGIjSCRVXYmTSq1xTOzch5AOqzjUq4D/OCsZobwaH151GAt639IQtFt3B7TgiyRw4YePAbqWX4AdlAyQlLylfLNv4Fw5WwAFDUl9vvSPRpyEv25t9OPAh2qvWYSGsymvsOQznTWlHb9+rwuBDZCns+qRXx9cTwo5tBHxh7aNI48zkiu8yyfsKpW/mzEfWFY1viXt+8Az9HQ93nwkzjhkx5gHamQA5TPuSpg4IOIXJ5iE6ND1hc5jIw== Received: from AM8P250MB0170.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:321::21) by AS1P250MB0456.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:4a6::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.17; Sat, 7 Feb 2026 16:51:32 +0000 Received: from AM8P250MB0170.EURP250.PROD.OUTLOOK.COM ([fe80::6d50:e32b:6064:8801]) by AM8P250MB0170.EURP250.PROD.OUTLOOK.COM ([fe80::6d50:e32b:6064:8801%5]) with mapi id 15.20.9587.013; Sat, 7 Feb 2026 16:51:31 +0000 Message-ID: Date: Sat, 7 Feb 2026 17:51:28 +0100 User-Agent: Mozilla Thunderbird Subject: Re: [PHP-DEV] [RFC] Partial Function Application for instance of non-static methods ("$this") To: =?UTF-8?Q?Tim_D=C3=BCsterhus?= Cc: php internals , Arnaud Le Blanc References: <64953ec741a4c6609519e1878ad37b54@bastelstu.be> <1c8827c1-a860-4e40-89fd-51698cbbe475@hotmail.com> <3038c7a5-416a-49d8-9322-5f323678cd9e@bastelstu.be> Content-Language: en-US In-Reply-To: <3038c7a5-416a-49d8-9322-5f323678cd9e@bastelstu.be> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-ClientProxiedBy: FR4P281CA0039.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:c7::18) To AM8P250MB0170.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:321::21) X-Microsoft-Original-Message-ID: <25a3ed69-ae3f-408f-8b3b-3e1f649d321f@hotmail.com> Precedence: list list-help: list-unsubscribe: list-post: List-Id: x-ms-reactions: disallow MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM8P250MB0170:EE_|AS1P250MB0456:EE_ X-MS-Office365-Filtering-Correlation-Id: 4dd1a59b-da1b-4816-4505-08de66692402 X-Microsoft-Antispam: BCL:0;ARA:14566002|6090799003|5072599009|23021999003|51005399006|19110799012|8060799015|15080799012|41001999006|461199028|56899033|40105399003|440099028|3412199025|12091999003|26104999006; X-Microsoft-Antispam-Message-Info: =?utf-8?B?NllYZExJZUwwc3p0WXFudTNwektGdldOd244UjZGOGVTU0xUc0U2YzZlakRl?= =?utf-8?B?bTlXZi9QTFo4YjkrWXJHYlVZb1pDWlBMWFFWeVlTQ09KaVh6L1N2MmJ5bDkv?= =?utf-8?B?Rm8zUlBRbDlXdjdMbFlrMFRpYnIrRFNuVUhLUHBYSkdjU2F3TXpRWXNCbk1a?= =?utf-8?B?YXMwZlh6bUVrOFVpWWNBVUpKNDRPeHlUbElVZ1k5MC91TjJHT3BuZE8rN2VE?= =?utf-8?B?bHpRMEIyTW9ZK0NaTkE4S2U5ZzFsN3hoYUlDOFowUWJqNlFqcDFla2QzWDBO?= =?utf-8?B?alRTek5GZm9iWERVVEpabjZuc0NsRmIrQ09pMktHTGZyMkRyMDBFNEdXb2Yx?= =?utf-8?B?M3ZNUThaaXJhaWRxRTRMSE9GN2RRdmtvWXhsbXhGMEZwQVBLMzlVelhnNkNx?= =?utf-8?B?OWh2TnlTQzNZZ2krWUJ6M2ozZ0tGSndYc0VjbjRXby9CL0ZJcFpxVFhyMWRS?= =?utf-8?B?aTdTeUZjNW5zSXI4YTV1ZytpQ2VnbkRVTUh4MjZaTTdtYjU0VU9GRjBHRnlz?= =?utf-8?B?eGNSNGNrRnBodmZsRG1uWlBRRzJSLzZoMjQwTmNwaDJLK1RRVzYyKzdlblEv?= =?utf-8?B?dXBPTXpHVWxHRmxBeHVrMGNlajNLSFJ2eG5TT1FIN2RDbWt6ck1BSmZtNVVo?= =?utf-8?B?RFFxL2VUaEFPcFdMeUhqQWZrYTJUejRCV2Y1ZG1CTncwbS9UYkN1bWVoVWVS?= =?utf-8?B?aTVJVTVXdm5rejhyUEV2R1BLUzJTak5Pc01ZSktkL0dpVy9xN0hFRVVoQnJv?= =?utf-8?B?bklBNU42SmlCaHZxend2cHRkcGlHcHJwOU9hUk9PaUFyUmxkVEplZGc2K1Nw?= =?utf-8?B?T3BwU0VGcHprTndKYWNGa1N5RkN1cUxTMmRZYzNGSUFDR1lLU2IyVEt0SkJC?= =?utf-8?B?Rmc2ZU9Dd2h1S2dMUXRVbGt0Y1BYb2xxYjVjUDRiVXdSVFM2RHd0ZlVkRGdM?= =?utf-8?B?cVdQSGZhTmhoY3U0SllSOCswUjJRRXZ0TndzdmZEVTVXaGYvTkFaZVIvOTZS?= =?utf-8?B?a3B3Rkx3QnhZa1JJcGxRSFJIR0J3S2JWV2s5dEl6SG9aeUM5K0tDNjVHTnlO?= =?utf-8?B?SllVWDMybnBiN21mYWkwNDhDaEZsYXZYRk9UUzc5endWME5kUEF0bWRSVmlk?= =?utf-8?B?alN4Y0VMSmZxTEtWTnF1TFpoOGVtUXZwZCtXa2NDWFdIRzFoeEZhSFNtSTdE?= =?utf-8?B?VzVrSTZodWhhVDdaVkVmUFVJZTdtbHZIMDhDdC9hL3JJakIxNUxxMDNyVmFG?= =?utf-8?B?MCt2dDZaQ09OenpBVlhlVkZYNTFOMGJmblpWT2F6WHVKV3R3NU5NaU5SYURt?= =?utf-8?B?SDFnWTFocXIyTVJQaHM1NEZiY0g1VTlMNmd2YkVsOFZRNHd0YzI2YzBWN3pa?= =?utf-8?B?Wi9aWmQzeGlZUnRTYlA1SHV1VW43aFhSOExFQzY0cmttQzVzek4xVmt5SUhx?= =?utf-8?B?YzRJR1JIb2RYbzBYMXR6VjQrRzBTdU80bGhlamhXT2p2MHp3ekNxNTAwRnRD?= =?utf-8?B?TjV1OS9ibE9PU2NNNXczU2gySy9nM2tyRFZuMVZ4R3lrOENya1ljQ2xwdk5H?= =?utf-8?B?MWppNzhOeGU3U0ZqbE01M3AzNzhsYzBid2VpMkhFc0NiNEY1cVIvM2tGZmJu?= =?utf-8?B?MHMrQWw2MlBSaTZnRmlaT3JsMC91alFvd1RsOUZpRWdxTmVuenJ0ZDRBRXJO?= =?utf-8?B?TUcrd05GdDN6dGdTV0lXMU1PVVhxaW91RVZONEk1d2ZDajdtNWxuUllHRStn?= =?utf-8?Q?c2CQ1vY78RwQ6wnPmfXmhy2WJadrnT69NayRwFW?= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Rkx6R2Z4clQ2TjBBWnY0Z1VnVENmNWRnMGcyYWJpNXFqNXUzdjl3dEtuWTND?= =?utf-8?B?Wm1aWFIrc1FERmJWemx6SSs3R29JWnZrSzc2YzZhQitFNXBaWnZpMmtHY1M4?= =?utf-8?B?c2tmNzJCM2c4aHVXZXY3eElnRmhSdDZGcTQrVWViRWJ6OVJXcEMxS2tibWFw?= =?utf-8?B?djZrU2YrRnJPaVp2K0xZTHBQMndTMndqNkw2NXZaTFNRbjEwK3ZLcWUxQ2Y3?= =?utf-8?B?dTRtVCs4RTZwNmhJQzhDaU5lbWVTdWc0b0luV2lMZXdDYzdyM0RSSVZlYWZ5?= =?utf-8?B?VzV3RFFPMU1jRWVXREtQZVI0RTVGVlB4cU1oNGhnMlB0djBtTHB4UTZNUHBB?= =?utf-8?B?UWxHSUxEK0RhbUg0VjVBU3NVUDhSNTM1WXBJa1FPUm9KSmREbjM2UFNaWkRk?= =?utf-8?B?a0J2dmdUSCtpOGlRZDAzRzJHVUt5bDhrbmRyb0pXYWlCbWlxSUNhSlZsNHJI?= =?utf-8?B?eEdYdW55eVIzWHZ1Y1VrSkhRUm9vVWJRZnJTSC9hMnVrYkYvcTkvc2w1Z2sw?= =?utf-8?B?d253N2lGR2oxVXdES09nSnVrRjVFRzJzTGtpV0xQeG5qMGRzZFJlR08zMjFS?= =?utf-8?B?UWRKZ0lWbUM5Q2UwNzF1WVdKVHpaaXU1TXEvMnpPS2pGcFJ5NUtzNTNLN0Fp?= =?utf-8?B?WjQ3TjZ1SnlrSDZnNDNETUdQNDlmaytmUnRLL01nZ2J2L2VXeTQ0eG1yZTNO?= =?utf-8?B?Rm5SV2tWZ1hTazR4czFsVURXVTNEVTRBd2tWVVBCQm0rbllKeTB1UWJRNHkx?= =?utf-8?B?bng3TUVjT3UrWVVnYjdTTVByRFZ4Mzl1bTRkTjBsUStjdlFLSFBhOFUxdjBu?= =?utf-8?B?ckpSakZaaE5BLzlEZURKZ1lHelJpM2tNN1ZlVFNpTlhLSkVseDhHM0ZFNDk1?= =?utf-8?B?N0FyeFhSRk9qWkNwTzZHTjZ5MitNNzhDOEFaTE1kNzB4V1Q0YTQxenRhb21t?= =?utf-8?B?aUVCQmpCckJMRTdRWDBlQ1FDVTFPRC85a0xyUER3NDM1RW5CWlU4OG9DU0dn?= =?utf-8?B?Z3M0WGNzQkJ4ekhJc3RudC9QNG9LNGlwNGo4THlKN29nSXVYcm1JMGNUL0RQ?= =?utf-8?B?dmxzMDhYR2FQNHZidkZlczlZek9jY1VUdE5JbEFLLzJGM1ZIUmEzeDVpUWox?= =?utf-8?B?dWM4ZWlINXVZRDhndlR4d1U0L1Z6N0VsUVd6aFlYWkc3S1hMZEtsWVRqUXF0?= =?utf-8?B?OVBRd1pqcE9Eb0JFaHpZZkNZSGN2UHhzT09odDRTdUlwdHRrcGR2OE5nTllR?= =?utf-8?B?anB0RDRPQjlmYnRsZzFiNnlEa0l4Lzl3WlJFUGx6VmRBTzlyTWllZis0SmZa?= =?utf-8?B?RWFQUUhubUR2TzNhV2UzcjRXMnpmOXozVjdCblRzbWFTL1Y1Zm5MeXZsZDVF?= =?utf-8?B?c09aN2dxRE9VOEY1L3ZqTzFLczVWZzRPbXF2VVkvLy9FanlEK1N3MWozN1B4?= =?utf-8?B?ZERJSG1Ob2RYMlV4WlVYaFkyNGx5YS8xRkt1bjF3VUV1RmU1YkE0OWltbDJl?= =?utf-8?B?ejhPWVlFcjVKcWdqRHFEbVZYTHNEcGpOUU10VHBSMURIZVUwR1JncmNkNWFo?= =?utf-8?B?bU9NNTZSZVlxUU1nQ0pTY0JNaDNNZWp1bDQyVXBFVE05ejQxZDVacUE1Vkxo?= =?utf-8?B?SE1iYnBiTkk3WktVTFlKZ2hxeS9TRk5IRnZpWk50Vkt2dkxGTXI0UUs4Qzhk?= =?utf-8?B?TXlDNWxqUmx1UldCZlpRQ3E1UkNVNnpMUWtSUnZvSGhtR2crMGdXSy96RXdK?= =?utf-8?B?bFNRVXNWcU5OMFltVlAzNldqTzZCcy9INnJCZVVvdXJCTEVPNktRYllWNWI0?= =?utf-8?B?TVdabE0zOEcwRm92cE5YUVhITjg4VjlkbG1nWFRjd0pvMFBNTzZXOGlhRFIx?= =?utf-8?B?ZGpQL3lqV3ZWYnRFSHdPTE43Y3R0Qm1iR3NURS9zeW9WRGJZdndtWjg2YWZJ?= =?utf-8?Q?PhLYndKm9o+7Tiu1Wn14movnBDWJrCFs?= X-OriginatorOrg: sct-15-20-9412-4-msonline-outlook-eee9a.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: 4dd1a59b-da1b-4816-4505-08de66692402 X-MS-Exchange-CrossTenant-AuthSource: AM8P250MB0170.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Feb 2026 16:51:29.9842 (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: AS1P250MB0456 From: bobwei9@hotmail.com (Bob Weinand) Hey Tim, I think you jumped to a conclusion without exploring the space of possibilities fully: On 6.2.2026 16:12:05, Tim Düsterhus wrote: > > With regard to your comment on the PR and the “Open Issue” listed in > the RFC about the name for the `$this` parameter in the resulting > Closure we have two options to offer: > > 1. `ClassName::methodName(this: ?)` with the parameter being called > `$__this`. > > 2. `ClassName::methodName($this: ?)` with the parameter being called > `$this`. > > Notably `ClassName::methodName(this: ?)` with the parameter being > called `$this` is not an option, because it would result in > inconsistent behavior: > > `ClassName::methodName(this: ?)` semantically relies on `$this` never > being a valid parameter name, such that `this: ?` can unambiguously > refer to the “implicit `$this` value” for a method call. However when > the parameter in the generated Closure would be called `$this`, there > is some ambiguity for cases like: > >      $c = DateTime::format(this: ?, format: ?); >      $c2 = $c(this: ?, format: 'c'); > > Is `this: ?` in the definition of `$c2` referring to the `$this` > parameter of the generated Closure or is it an attempt to partially > apply the `Closure` object for the `Closure::__invoke()` method that > is referenced by `$c`? > > Similarly allowing `this: $object` with a concrete value is explicitly > disallowed, because of possible ambiguity with regard to inheritance: > >      class P { public function m() { echo "P"; } } >      class C extends P { public function m() { echo "C"; } } > >      // is this calling P::m() or is this calling C::m()? >      P::m(this: new C()); > > This would however prevent calling a partially applied instance method > with named arguments: > >      $c = DateTime::format(this: ?, format: ?); >      // Disallowed, because this: must be partially applied. >      $c(this: new DateTime(), format: 'c'); > > If the syntax to define the PFA was using `C::m($this: ?)`, `$this` in > the resulting Closure would just work like any other parameter. > 1. `ClassName::methodName(this: ?)` with the parameter being called > `$__this`. > > 2. `ClassName::methodName($this: ?)` with the parameter being called > `$this`. Allowing P::m(this: $object) with a concrete value should behave identically to P::m(this: ?)($object), which in turn should behave identically to $object->m() if called outside of C (or its children), otherwise equivalently to `private function forwardM() { return P::m(); } $object->forwardM();` (i.e. a (grand)parent class method can always be called). This approach is consistent with how method calling works in child classes. More normatively for any class P and method m, P::m(this: ?) needs to store the class where the PFA closure is created as called_scope on the Closure when that class is instanceof P unless P::m is abstract, so that any call to the resulting closure is checked against that called_scope: If the $this object the Closure is ultimately called with is instanceof the called_scope of the Closure, the specific given method must be called (i.e. specifically P::m()), otherwise the object is merely checked for being instanceof P and the method m on the $this object is called directly. Defining it this way preserves LSP guarantees, with maximum flexibility - making it for example perfectly possible to call array_map(ParentClass::someValue(this: ?), $objectsArray) without being surprised that it subtly actually calls the child method someValue on objects which are instanceof the containing class. The neat benefit is that any $obj->method() call is now generalized (on the surface of the language semantics, obviously not implementation wise) as {get_class($obj)}::method(this: $obj), which makes the this-PFA a trivial extension of just having ? for the this parameter. It also obsoletes any concerns about how the this parameter ends up called in the resulting PFA - because it's just a "normal" parameter then, from the perspective of the caller. The only small caveat is Closure::__invoke(this: ?), which literally is just sort of an identity function and thus useless. To solve that, we should just decide to have an explicit this parameter on Closures take precendence. (Ultimately __invoke is more of an implementation detail of Closure, than anything else). Also of note is that having a proper implicit $this parameter on methods must not have a position (as in positional parameters). Otherwise conflicts arise with e.g. the implicit $this forwarding in parent::m() syntax in class scope. (obviously, once you create a PFA P::m(this: ?, ?) the first positional parameter becomes the $this parameter and the original first parameter is now the second one.) To summarize: Please introduce a first-class implicit $this parameter on any non-static method call, and have PFA work naturally with it, without doing contortions in language semantics / introducing a very PFA-specific syntax. Thanks, Bob P.s.: You should possibly add to future scope allowing object::someMethod(this: ?) or class::someMethod(this: ?) to allow proper duck typing without having to know the actual object behind. That's something I see people asking for, too.