for (;;);{"error":null,"payload":{"timeline":"\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_56\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/woaup5gfhgyt3xpvwi4f\/PHID-FILE-xcnwlpurjz3rsuiv56td\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/Tgr\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4174041\" id=\"4174041\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-pencil phui-timeline-icon\" data-meta=\"0_55\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Tgr\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_0\"\u003eTgr\u003c\/a\u003e created this task.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4174041\" data-sigil=\"has-tooltip\" data-meta=\"0_54\"\u003e\u003cspan class=\"screen-only\"\u003eMay 2 2018, 10:18 AM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-02 10:18:09 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_59\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"display: none;\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4174050\" id=\"4174050\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-user-plus phui-timeline-icon\" data-meta=\"0_58\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"phui-handle\" data-sigil=\"hovercard\" data-meta=\"0_5\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-lock lightgreytext\" data-meta=\"0_6\" aria-hidden=\"true\"\u003e\u003c\/span\u003eRestricted Application\u003c\/span\u003e added a subscriber: \u003ca href=\"\/p\/Aklapper\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_7\"\u003eAklapper\u003c\/a\u003e. \u003cspan class=\"phui-timeline-extra-information\"\u003e \u00b7 \u003ca href=\"\/herald\/transcript\/2357180\/\"\u003eView Herald Transcript\u003c\/a\u003e\u003c\/span\u003e\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4174050\" data-sigil=\"has-tooltip\" data-meta=\"0_57\"\u003e\u003cspan class=\"screen-only\"\u003eMay 2 2018, 10:18 AM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-02 10:18:10 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_70\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-major-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/v5wmnfiaelrd6nztxd3a\/PHID-FILE-s57znldbv3qchtewuryd\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/daniel\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-badges\"\u003e\u003cul class=\"phui-badge-flex-view grouped flex-view-collapsed \"\u003e\u003cli class=\"phui-badge-flex-item\"\u003e\u003ca class=\"phui-badge-mini phui-badge-mini-indigo \" href=\"\/badges\/view\/14\/\" data-sigil=\"has-tooltip\" data-meta=\"0_68\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-empire\" data-meta=\"0_69\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/a\u003e\u003c\/li\u003e\u003c\/ul\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003cdiv class=\"phui-timeline-inner-content\"\u003e\u003ca name=\"4174100\" id=\"4174100\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon phui-timeline-title-with-menu\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-user-plus phui-timeline-icon\" data-meta=\"0_67\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/daniel\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_9\"\u003edaniel\u003c\/a\u003e subscribed.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4174100\" data-sigil=\"has-tooltip\" data-meta=\"0_66\"\u003e\u003cspan class=\"screen-only\"\u003eMay 2 2018, 10:34 AM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-02 10:34:13 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003ca href=\"#\" class=\"phui-timeline-menu\" aria-haspopup=\"true\" aria-expanded=\"false\" data-sigil=\"phui-dropdown-menu\" data-meta=\"0_64\"\u003e\u003cspan class=\"aural-only\"\u003eComment Actions\u003c\/span\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-caret-down\" data-meta=\"0_65\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-core-content\"\u003e\u003cspan class=\"transaction-comment\" data-sigil=\"transaction-comment\" data-meta=\"0_8\"\u003e\u003cdiv class=\"phabricator-remarkup\"\u003e\u003cp\u003e...and it's not just adding functions, which can be done by having the new interface extend the old interface. Still painful for calling code, but doable.\u003c\/p\u003e\n\n\u003cp\u003ewhat is worse is changing method signature - that becomes virtually impossible.\u003c\/p\u003e\n\n\u003cp\u003ePerhaps we just should not ask extensions to implement interfaces at all. Perhaps we should always provide a base class. We could declare an interface and type-hint against that, if that seems useful. This strategy seems to work reasonable well for Java: for the List interface, there is an AbstractList base class that can be used by code that wants to implement the List interface; this makes it easy to introduce a new ListNG interface with default\/compat implementations in the AbstractList base class.\u003c\/p\u003e\n\n\u003cp\u003eThis problem checks the boxes for an RFC: it's strategic, cross-cutting and hard to undo. The RFC could consist just of the problem statement, to explore the topic and narrow the field of solutions. Or it could propose a concrete policy, and discuss that proposition.\u003c\/p\u003e\u003c\/div\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_73\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/3ndsxtl44eofytwep42p\/PHID-FILE-4ybkrghfwjvx4ndzbgkv\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/kchapman\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4180560\" id=\"4180560\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-link phui-timeline-icon\" data-meta=\"0_72\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/kchapman\/\" class=\"phui-handle handle-availability-disabled phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_10\"\u003e\u003cspan class=\"perfect-circle\"\u003e\u2022\u003c\/span\u003e kchapman\u003c\/a\u003e added a project: \u003ca href=\"\/tag\/techcom-rfc\/\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_11\"\u003eTechCom-RFC\u003c\/a\u003e.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4180560\" data-sigil=\"has-tooltip\" data-meta=\"0_71\"\u003e\u003cspan class=\"screen-only\"\u003eMay 3 2018, 10:59 PM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-03 22:59:49 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_84\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-major-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/v5wmnfiaelrd6nztxd3a\/PHID-FILE-s57znldbv3qchtewuryd\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/daniel\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-badges\"\u003e\u003cul class=\"phui-badge-flex-view grouped flex-view-collapsed \"\u003e\u003cli class=\"phui-badge-flex-item\"\u003e\u003ca class=\"phui-badge-mini phui-badge-mini-indigo \" href=\"\/badges\/view\/14\/\" data-sigil=\"has-tooltip\" data-meta=\"0_82\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-empire\" data-meta=\"0_83\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/a\u003e\u003c\/li\u003e\u003c\/ul\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003cdiv class=\"phui-timeline-inner-content\"\u003e\u003ca name=\"4181450\" id=\"4181450\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon phui-timeline-title-with-menu\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-comment phui-timeline-icon\" data-meta=\"0_81\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/daniel\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_12\"\u003edaniel\u003c\/a\u003e added a comment.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4181450\" data-sigil=\"has-tooltip\" data-meta=\"0_80\"\u003e\u003cspan class=\"screen-only\"\u003eMay 4 2018, 9:33 AM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-04 09:33:57 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003ca href=\"#\" class=\"phui-timeline-menu\" aria-haspopup=\"true\" aria-expanded=\"false\" data-sigil=\"phui-dropdown-menu\" data-meta=\"0_78\"\u003e\u003cspan class=\"aural-only\"\u003eComment Actions\u003c\/span\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-caret-down\" data-meta=\"0_79\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-core-content\"\u003e\u003cspan class=\"transaction-comment\" data-sigil=\"transaction-comment\" data-meta=\"0_13\"\u003e\u003cdiv class=\"phabricator-remarkup\"\u003e\u003cp\u003e\u003ca href=\"\/p\/Tgr\/\" class=\"phui-tag-view phui-tag-type-person \" data-sigil=\"hovercard\" data-meta=\"0_2\"\u003e\u003cspan class=\"phui-tag-core phui-tag-color-person\"\u003e@Tgr\u003c\/span\u003e\u003c\/a\u003e TechCom would like to discuss this topic on IRC next Wednesday, at 23:00 CEST \/ 2pm PDT. The purpose of the discussion would be to explore the problem and possible solutions, not approving a concrete proposal. Do you think such a public conversation would be useful? Does that time work for you?\u003c\/p\u003e\u003c\/div\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_87\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/v5wmnfiaelrd6nztxd3a\/PHID-FILE-s57znldbv3qchtewuryd\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/daniel\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4186548\" id=\"4186548\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-link phui-timeline-icon\" data-meta=\"0_86\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/daniel\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_14\"\u003edaniel\u003c\/a\u003e mentioned this in \u003ca href=\"\/T194038\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_15\"\u003eT194038: Introduce ContentHandler::getSecondaryDataUpdates to replace Content::getSecondaryDataUpdates\u003c\/a\u003e.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4186548\" data-sigil=\"has-tooltip\" data-meta=\"0_85\"\u003e\u003cspan class=\"screen-only\"\u003eMay 7 2018, 1:00 PM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-07 13:00:23 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_99\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-major-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/3ndsxtl44eofytwep42p\/PHID-FILE-4ybkrghfwjvx4ndzbgkv\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/kchapman\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-badges\"\u003e\u003cul class=\"phui-badge-flex-view grouped flex-view-collapsed \"\u003e\u003cli class=\"phui-badge-flex-item\"\u003e\u003ca class=\"phui-badge-mini phui-badge-mini-yellow \" href=\"\/badges\/view\/21\/\" data-sigil=\"has-tooltip\" data-meta=\"0_97\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-users\" data-meta=\"0_98\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/a\u003e\u003c\/li\u003e\u003c\/ul\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003cdiv class=\"phui-timeline-inner-content\"\u003e\u003ca name=\"4187793\" id=\"4187793\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon phui-timeline-title-with-menu\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-columns phui-timeline-icon\" data-meta=\"0_95\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/kchapman\/\" class=\"phui-handle handle-availability-disabled phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_16\"\u003e\u003cspan class=\"perfect-circle\"\u003e\u2022\u003c\/span\u003e kchapman\u003c\/a\u003e moved this task from \u003ca href=\"\/project\/board\/52\/\" class=\"phui-handle\" data-sigil=\"hovercard\" data-meta=\"0_17\"\u003eP1: Define\u003c\/a\u003e to \u003ca href=\"\/project\/board\/52\/\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_18\"\u003eRequest IRC meeting\u003c\/a\u003e on the \u003ca href=\"\/tag\/techcom-rfc\/\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_19\"\u003eTechCom-RFC\u003c\/a\u003e board.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4187793\" data-sigil=\"has-tooltip\" data-meta=\"0_94\"\u003e\u003cspan class=\"screen-only\"\u003eMay 7 2018, 6:50 PM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-07 18:50:14 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon phui-timeline-title-with-menu\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-user-plus phui-timeline-icon\" data-meta=\"0_96\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/kchapman\/\" class=\"phui-handle handle-availability-disabled phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_21\"\u003e\u003cspan class=\"perfect-circle\"\u003e\u2022\u003c\/span\u003e kchapman\u003c\/a\u003e subscribed.\u003c\/div\u003e\u003ca href=\"#\" class=\"phui-timeline-menu\" aria-haspopup=\"true\" aria-expanded=\"false\" data-sigil=\"phui-dropdown-menu\" data-meta=\"0_92\"\u003e\u003cspan class=\"aural-only\"\u003eComment Actions\u003c\/span\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-caret-down\" data-meta=\"0_93\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-core-content\"\u003e\u003cspan class=\"transaction-comment\" data-sigil=\"transaction-comment\" data-meta=\"0_20\"\u003e\u003cdiv class=\"phabricator-remarkup\"\u003e\u003cp\u003eTechCom is going to host a RFC IRC Meeting 2018-05-09 in the #wikimedia-office channel at 2pm PST(22:00 UTC, 23:00 CET)\u003c\/p\u003e\u003c\/div\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_102\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/3iigldu33itwnv6qred6\/PHID-FILE-crux7ijupvjze2tyjdst\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/Osnard\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4189177\" id=\"4189177\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-user-plus phui-timeline-icon\" data-meta=\"0_101\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Osnard\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_22\"\u003eOsnard\u003c\/a\u003e subscribed.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4189177\" data-sigil=\"has-tooltip\" data-meta=\"0_100\"\u003e\u003cspan class=\"screen-only\"\u003eMay 8 2018, 5:48 AM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-08 05:48:16 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_105\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/chvngxnqoko6t3z6hc6b\/PHID-FILE-apmfbzbqf4i24fx5ac7l\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/Nikerabbit\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4189262\" id=\"4189262\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-user-plus phui-timeline-icon\" data-meta=\"0_104\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Nikerabbit\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_23\"\u003eNikerabbit\u003c\/a\u003e subscribed.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4189262\" data-sigil=\"has-tooltip\" data-meta=\"0_103\"\u003e\u003cspan class=\"screen-only\"\u003eMay 8 2018, 6:58 AM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-08 06:58:32 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_108\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/zirzntnbnbimsxdels47\/PHID-FILE-tu3ola3spvpugy5kzs6b\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/Mholloway\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4191899\" id=\"4191899\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-user-plus phui-timeline-icon\" data-meta=\"0_107\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Mholloway\/\" class=\"phui-handle handle-availability-disabled phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_24\"\u003e\u003cspan class=\"perfect-circle\"\u003e\u2022\u003c\/span\u003e Mholloway\u003c\/a\u003e subscribed.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4191899\" data-sigil=\"has-tooltip\" data-meta=\"0_106\"\u003e\u003cspan class=\"screen-only\"\u003eMay 8 2018, 7:34 PM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-08 19:34:22 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_117\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-major-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/woaup5gfhgyt3xpvwi4f\/PHID-FILE-xcnwlpurjz3rsuiv56td\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/Tgr\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003cdiv class=\"phui-timeline-inner-content\"\u003e\u003ca name=\"4195319\" id=\"4195319\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon phui-timeline-title-with-menu\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-comment phui-timeline-icon\" data-meta=\"0_116\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Tgr\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_25\"\u003eTgr\u003c\/a\u003e added a comment.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4195319\" data-sigil=\"has-tooltip\" data-meta=\"0_115\"\u003e\u003cspan class=\"screen-only\"\u003eMay 9 2018, 8:57 PM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-09 20:57:08 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003ca href=\"#\" class=\"phui-timeline-menu\" aria-haspopup=\"true\" aria-expanded=\"false\" data-sigil=\"phui-dropdown-menu\" data-meta=\"0_113\"\u003e\u003cspan class=\"aural-only\"\u003eComment Actions\u003c\/span\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-caret-down\" data-meta=\"0_114\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-core-content\"\u003e\u003cspan class=\"transaction-comment\" data-sigil=\"transaction-comment\" data-meta=\"0_26\"\u003e\u003cdiv class=\"phabricator-remarkup\"\u003e\u003cp\u003eSome of the options that come to mind:\u003c\/p\u003e\n\n\u003cul class=\"remarkup-list\"\u003e\n\u003cli class=\"remarkup-list-item\"\u003eJust don't use interfaces (use abstract base classes instead). Easy enough but loses the two benefits interfaces provide: multiple inheritance and the ability of implementers to use their own base classes.\u003c\/li\u003e\n\u003cli class=\"remarkup-list-item\"\u003eUse interfaces but require\/recommend implementers to extend a standard base class (which can provide fallback behavior \/ null implementations). Has the same problems, and does not help with adding new parameters to an existing method.\u003c\/li\u003e\n\u003cli class=\"remarkup-list-item\"\u003eLike above but use a trait instead of a base class. Does not help with adding new parameters to an existing method. Also, multiple inheritance with traits is kinda messy.\u003c\/li\u003e\n\u003cli class=\"remarkup-list-item\"\u003eVersion interfaces; new versions of classes can implement both the new and the old version. Works but eww.\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/div\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_126\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-major-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/woaup5gfhgyt3xpvwi4f\/PHID-FILE-xcnwlpurjz3rsuiv56td\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/Tgr\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003cdiv class=\"phui-timeline-inner-content\"\u003e\u003ca name=\"4195628\" id=\"4195628\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon phui-timeline-title-with-menu\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-comment phui-timeline-icon\" data-meta=\"0_125\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Tgr\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_27\"\u003eTgr\u003c\/a\u003e added a comment.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4195628\" data-sigil=\"has-tooltip\" data-meta=\"0_124\"\u003e\u003cspan class=\"screen-only\"\u003eMay 9 2018, 10:28 PM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-09 22:28:58 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003ca href=\"#\" class=\"phui-timeline-menu\" aria-haspopup=\"true\" aria-expanded=\"false\" data-sigil=\"phui-dropdown-menu\" data-meta=\"0_122\"\u003e\u003cspan class=\"aural-only\"\u003eComment Actions\u003c\/span\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-caret-down\" data-meta=\"0_123\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-core-content\"\u003e\u003cspan class=\"transaction-comment\" data-sigil=\"transaction-comment\" data-meta=\"0_28\"\u003e\u003cdiv class=\"phabricator-remarkup\"\u003e\u003cp\u003eIRC log of today's RfC meeting: \u003cdiv class=\"paste-embed\"\u003e\u003cdiv class=\"paste-embed-head\"\u003e\u003ca href=\"\/P7111\"\u003eP7111 TechCom RfC meeting 2018-05-10\u003c\/a\u003e\u003c\/div\u003e\u003cdiv class=\"paste-embed-body\" style=\"max-height: 27.6em;\"\u003e\u003cdiv class=\"phabricator-source-code-container\"\u003e\u003ctable class=\"phabricator-source-code-view remarkup-code PhabricatorMonospaced\" data-sigil=\"phabricator-source has-symbols\" data-meta=\"0_3\"\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e1\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:00 < kchapman> #startmeeting RFC meeting\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e2\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:00 < kchapman> #topic Come up with a strategy for handling interface changes https:\/\/phabricator.wikimedia.org\/T193613\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e3\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:00 -!- dmaza [uid298049@gateway\/web\/irccloud.com\/x-lnicfitvzvwcmtgg] has quit [Client Quit] \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e4\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:01 -!- ccogdill [~ccogdill@tan241.corp.wikimedia.org] has quit [Quit: ccogdill] \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e5\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:01 < kchapman> does the bot needed to be kicked? For some reason I remember it responding after the telling it to start the meeting (I may have remembered wrong)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e6\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:02 < legoktm> the bot isn't even in the channel :(\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e7\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:02 < legoktm> it is supposed to say things, yes\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e8\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:02 < DanielK_WMDE> yea, that'S the problem\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e9\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:02 < DanielK_WMDE> we can just use the bot commands anyway, and then laterr grep for them by hand\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e10\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:03 < TimStarling> there's no meetbot\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e11\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:03 < DanielK_WMDE> just spottinng #info as a marker\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e12\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:03 < DanielK_WMDE> tgr: you here?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e13\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:03 < tgr> o\/ \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e14\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:03 < DanielK_WMDE> \\o\/ \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e15\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:03 -!- ccogdill [~ccogdill@tan241.corp.wikimedia.org] has joined #wikimedia-office \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e16\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:03 < kchapman> who else is here to discuss interface changes?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e17\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:04 -!- heatherw [~administr@wikimedia\/heatherawalls] has joined #wikimedia-office \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e18\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:04 * legoktm waves\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e19\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:04 -!- dannyh [~textual@wikimedia\/DannyH-WMF] has joined #wikimedia-office \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e20\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:05 < TimStarling> QCI is finished so yes I can do this now\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e21\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:05 -!- dannyh [~textual@wikimedia\/DannyH-WMF] has quit [Read error: Connection reset by peer] \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e22\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:05 < kchapman> tgr: do you want to provide a brief summary since you filed the ticket?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e23\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:05 -!- dannyh [~textual@wikimedia\/DannyH-WMF] has joined #wikimedia-office \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e24\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:05 < tgr> sure\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e25\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:06 < tgr> we are relying on interfaces increasingly often as the boundary between core and extensions\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e26\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:07 < tgr> in the past we said "extend class Foo if you want to customize this functionality", these days we say "implement interface Foo"\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e27\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:07 < tgr> that's generally a good thing as it doesn't prevent implementers from extending their own base classes, implementing multiple interfaces in one class etc\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e28\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:08 < tgr> but changing the boundary becomes harder\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e29\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:08 < tgr> e.g. adding a new optional parameter to a method is not a problem when we do it in a base class\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e30\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:09 < tgr> for an interface, that will cause a fatal error for implementers who did not update accordingly\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e31\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:09 < tgr> (see the task for examples)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e32\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:10 < tgr> so what do we intend to do to avoid inflicting that kind of unpleasantness on extension developers?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e33\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:11 < TimStarling> just recommending abstract classes over interfaces would solve some of it\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e34\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:12 < DanielK_WMDE> I'd still want to define and type-hint against interfaces\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e35\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:12 < tgr> that's certainly an option\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e36\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:12 < DanielK_WMDE> but offering base classes would ease the pain\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e37\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:12 < tgr> maybe the least bad\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e38\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:12 -!- jgleeson [~jgleeson@wikimedia\/jgleeson-wmf] has quit [Remote host closed the connection] \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e39\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:13 -!- jgleeson [~jgleeson@wikimedia\/jgleeson-wmf] has joined #wikimedia-office \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e40\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:13 < DanielK_WMDE> side note: "e.g. adding a new optional parameter to a method is not a problem when we do it in a base class" isn't really true. this triggers "Declaration of B::f($a) should be \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e41\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e compatible with A::f($a, $b = '')"...\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e42\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:13 < tgr> abstract base classes are annoying as they prevent you from using your own class hierarchies\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e43\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:13 < DanielK_WMDE> indeed.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e44\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:13 < DanielK_WMDE> an alternative is to never modify interfaces, and replace them with different interfaces instead.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e45\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:14 < legoktm> versioned interfaces?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e46\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:14 < DanielK_WMDE> this is easier with small interfaces. and we could put version numbers in (*not* pretty, but effective)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e47\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:14 < Krinkle> The danger with base classes is also, that it is easy to blur the line of what a subclass is meant to add or change. E.g. where the end result can become incompatible with itself.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e48\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:14 < DanielK_WMDE> the problem is - this doesn't work well with type hints\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e49\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:14 < Krinkle> If we encourage base classes to solve the interface issue, I think we'd need to be very strict and proactively mark things as final to avoid this problem, e.g. "if overriding method x, \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e50\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e other assumptions may differ and must require subclass to implement interface directly"\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e51\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:15 < DanielK_WMDE> legoktm: we can do versioned interfaces, but what would code hint against? code would often have to accept both, and then have some utility method for mapping one to the other\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e52\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:15 < DanielK_WMDE> also not totally horrible\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e53\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:15 < DanielK_WMDE> but i like type hints...\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e54\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:15 < Krinkle> Whilst still allowing simple overrides and extensions, where the base class can solve the problem of an additional utility being added to the interface.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e55\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:16 < DanielK_WMDE> Krinkle: oh yes. it should be very clear which methods are expected to be overwritten, and which must not\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e56\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:16 < Krinkle> If our main example is "core concept X, add a method that uses other existing methods" e.g. convenience methods, another way to solve that is to use composition.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e57\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:16 < tgr> DanielK_WMDE: could do interface Foo_v1 extends Foo, interface Foo_v2 extends Foo\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e58\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:16 < DanielK_WMDE> Krinkle: do you agree that if we go with base classes, we should still define interfaces?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e59\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:16 < tgr> but it makes the learning curve steeper\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e60\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:17 < Krinkle> DanielK_WMDE: Yes, we should keep interfaces either way, especially if we're going to be strict about adding 'final' to our base classes where needed (e.g. for convenience methods).\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e61\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:17 < DanielK_WMDE> tgr: ok - and calling code then type hints against Foo, and then calls makeFooV2, which looks at the concrete class and provides mapping?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e62\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:17 < tgr> interfaces + base classes don't really improve things IMO, you have all the problems you'd have with just base classes (forced hierarchy)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e63\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:18 < DanielK_WMDE> we have that kind of thing with Title::newFromLinkTarget (though that actually maps to new to thhe old interface, nto the other way around)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e64\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:18 < Krinkle> I'm not entirely sure though, what that would mean if we have both. Does that mean the interface will not change in breaking ways and remain a not-so-useful subset? (e.g. can't type-hint \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e65\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e against it because methods may be missing), or does that mean that we will break the interface frequently and only provide deprecation\/removal notices for the base class (e.g. interface \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e66\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e is allowed but requires higher maintenance burden)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e67\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:19 < tgr> DanielK_WMDE: yeah, if it wants to be compatible with multiple core versions, it hints against Foo and then does if ($foo instanceof Foo_v1) or something\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e68\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:19 < DanielK_WMDE> maybe we can do an example. We have an interface Foo with method frob($x) which we want to turn into frob($x, $y). And we have method sizzle( Foo $foo ) in some other class.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e69\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:19 < DanielK_WMDE> what do we do?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e70\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:20 * DanielK_WMDE sets up an therpad\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e71\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:20 < DanielK_WMDE> https:\/\/etherpad.wikimedia.org\/p\/FrobSizzle\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e72\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:22 < tgr> actually, base classes don't work for that use case\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e73\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:22 < tgr> they would for adding a new method\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e74\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:23 < DanielK_WMDE> well, one option is to add frob2()\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e75\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:23 < Krinkle> Adding a non-optional parameter seems odd. Is there a past\/real example where that happened?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e76\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:23 < DanielK_WMDE> the "add parameter" case can easily be mapped to "add method"\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e77\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:23 < DanielK_WMDE> Krinkle: we can make it optional. same problem. php still complains\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e78\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:23 < Krinkle> Seems like this makes the method do something entirely different, so yeah, new method would make more sense.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e79\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:24 < Krinkle> Sure, but it being optional makes the base class and other interaction easier to deal with.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e80\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:24 < Krinkle> In that it reduces the scope to developers providing the classes, as opposed to existing callers not working any more.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e81\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:24 < Krinkle> I don't think we should include changes in this conversation that would require callers to methods to change.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e82\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:25 < tgr> there are two scenarios where change is a problem\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e83\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:25 -!- drewmutt is now known as California \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e84\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:25 < tgr> one where the extension receives an instance of Foo and does something with it\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e85\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:25 < DanielK_WMDE> Krinkle: i have changed the etherpad accordingly\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e86\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:26 < tgr> I don't think it matters in that case whether Foo is a class or an interface\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e87\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:26 < tgr> the other is where the extension implements\/extends Foo\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e88\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:26 < tgr> think Content, AuthPlugin etc\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e89\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:26 < tgr> that's where interfaces become problematic\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e90\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:27 -!- California is now known as drewmutt \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e91\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:29 < TimStarling> if we have versioned interfaces, how would we name them? most of the class names that originally had underscores have been renamed now to take the underscores out\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e92\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:30 < TimStarling> should we have a versioned namespace which interfaces are inside?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e93\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:31 -!- Mneisler [~textual@108-69-129-119.lightspeed.sntcca.sbcglobal.net] has quit [Quit: Computer has gone to sleep.] \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e94\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:31 < legoktm> MediaWiki\\Something\\AnotherThingV1\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e95\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:31 < DanielK_WMDE> TimStarling: i think having the same interface names in version namespaces would be very confusing, since all code that provides some legacy compatibility would have to juggle \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e96\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e multiple interfaces with the same name\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e97\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:32 -!- Mneisler [~textual@108-69-129-119.lightspeed.sntcca.sbcglobal.net] has joined #wikimedia-office \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e98\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:33 < tgr> if you end up with V1\\Foo and V2\\Foo that's actually not too bad\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e99\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:33 -!- Jianhui67 [uid54581@wikimedia\/Jianhui67] has quit [Quit: Connection closed for inactivity] \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e100\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:33 < Krinkle> There is use..as...; which could be used for that if multiple are needed at the same time\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e101\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:33 < tgr> but could just Foo and Foo2 (or FooV2)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e102\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:34 < DanielK_WMDE> I have updated https:\/\/etherpad.wikimedia.org\/p\/FrobSizzle\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e103\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:34 < DanielK_WMDE> sorry for the silly names :)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e104\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:34 < DanielK_WMDE> i think this approach can work for adding methods (and parameters)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e105\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:34 < tgr> it's kind of like API versioning: ugly, but might be less confusing to reusers than continuous deprecation of things\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e106\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:34 < DanielK_WMDE> but it's not... pretty.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e107\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:36 < tgr> one problem with the etherpad example is, how do you get rid of the deprecated method?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e108\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:37 < DanielK_WMDE> tgr: you stop using the old interface\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e109\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:37 < DanielK_WMDE> finally, the new interface stops extending the old interface\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e110\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:37 < tgr> doesn't help, still has to be implemented\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e111\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:38 < tgr> uh, nvm, you are right\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e112\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:38 < DanielK_WMDE> yea - stop hinting for \/ calling it. then, make sure nothing implements it diectly. after that, remove the itnerface. then remove the stub methods that were used to implement it.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e113\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:38 < tgr> that will work as long as all type hints are gone\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e114\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:38 < Krinkle> Sorry about adding the Line and Square thingies, but I realised something odd.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e115\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:38 < DanielK_WMDE> maybe i'll add all that to the etherpad. is that useful, or a distraction?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e116\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:38 < Krinkle> Foo2Adapter\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e117\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:39 < Krinkle> How can it implement the new interface for an object that only has the old interface?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e118\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:39 < Krinkle> It seems like the old one isn't capable of taking $y\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e119\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:39 < Krinkle> ignoring it seems odd.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e120\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:39 < Krinkle> An optional parameter is backward compatible, but not forward compatible.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e121\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:39 < Krinkle> If it is given, it is significant and would break the contract if it is ignored.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e122\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:40 < DanielK_WMDE> it may. depends on the contract\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e123\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:40 < DanielK_WMDE> for MCR, i'm introducing slot role parameters in some places\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e124\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:40 < DanielK_WMDE> in that case, I would just check that the requested role is "main", and fail if it's not\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e125\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:41 < tgr> yeah, just use some sensible default\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e126\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:41 < tgr> that problem is not specific to interfaces\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e127\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:41 < Krinkle> Yeah, but then if it is called with a non-main slot, it can't be ignored.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e128\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:42 < DanielK_WMDE> no, it would just behave as if that slot did not exist\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e129\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:42 < Krinkle> I haven't looked at all the angles, but seems to me like the code should be designed in a way where (talking about MCR) a class for main-slot only can't be given a non-main slot. E.g. \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e130\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e isn't about failing at run-time, but about making it impossible to reach without type errors.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e131\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:42 < DanielK_WMDE> of course, this restriction has to be built into the new methods contract\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e132\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:44 < Krinkle> When the new interface is added, nothing expects it yet. Newer consumer code that wants to use it can type for it, but that would be its own breaking change of the consumers own class, \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e133\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e which would require deprecation and\/or avoidance.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e134\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:45 < Krinkle> I'm not sure adapters are feasible as a general solution to the issue.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e135\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:45 < kchapman> Reminder: 15 minutes left. Also if you use the #info tag it will help the katebot grep to create the minutes\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e136\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:47 -!- dmaza [uid298049@wikimedia\/dmaza-wmf] has joined #wikimedia-office \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e137\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:47 < DanielK_WMDE> Krinkle: i think it's a working option, but it's not a very nice and easy one.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e138\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:47 < DanielK_WMDE> but maybe we want to circle back: do we want to go back to base classes, because of all of this?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e139\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:48 < tgr> would be nice to have a survey of how other PHP frameworks deal with this\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e140\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:48 < Krinkle> How do base classes solve the problem of being able to introduce a new primitive\/requirement into the system in a non-breaking way for sub classes?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e141\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:48 < Krinkle> I don't think that's a solveable problem. New requirements require new implementation.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e142\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:49 -!- Stryn [~chatzilla@wikipedia\/Stryn] has quit [Ping timeout: 255 seconds] \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e143\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:50 -!- wm-labs-meetbot [tools.meet@wikimedia\/bot\/wm-labs-meetbot] has joined #wikimedia-office \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e144\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:51 -!- Stryn [~chatzilla@wikipedia\/Stryn] has joined #wikimedia-office \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e145\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:51 < DanielK_WMDE> Krinkle: it's not a prooblem solvable in a general way. but often we have additional constraints or guarantees that allow this to be solved.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e146\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:51 < DanielK_WMDE> e.g. the "main" slot.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e147\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:51 -!- ccogdill [~ccogdill@tan241.corp.wikimedia.org] has quit [Quit: ccogdill] \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e148\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:52 < Krinkle> That means if we make use of a non-main slot in core (e.g. for categories) than any wiki using their own storage engine would just fail at run-time with the check we add.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e149\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:52 < kchapman> Just 8 minutes left.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e150\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:52 < Krinkle> That would trade a static error for a run-time exception.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e151\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:53 < DanielK_WMDE> tgr: is this conversation useful? is there any concrete question we should try to answer in the remaining minutes?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e152\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:53 < tgr> no, it just means they couldn't use categories\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e153\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:53 < Krinkle> if we don't make use of the added requirements by default, then that would be easier, but that sounds more like a feature flag.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e154\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:53 -!- jgleeson [~jgleeson@wikimedia\/jgleeson-wmf] has quit [Ping timeout: 250 seconds] \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e155\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:54 -!- Nudin_WMDE [~nudin@2001:a61:2bb9:3500:4410:b996:e39e:55fa] has quit [Quit: Verlassend] \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e156\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:54 -!- ccogdill [~ccogdill@tan241.corp.wikimedia.org] has joined #wikimedia-office \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e157\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:54 < tgr> DanielK_WMDE: it helped to make the problem less vague, yeah\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e158\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:55 < kchapman> 5 more minutes. tgr anything else for the remaining time?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e159\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:55 < DanielK_WMDE> tgr: we don't have meetbot here... can you put a summary on the ticket?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e160\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:55 < tgr> it sounds like we could use some real-life examples (past changes which would have been problematic with an interface) to see how does Krinkle's objection pan put there\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e161\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:56 < Krinkle> Just to clarify, I don't object any current proposal, but I have certain doubts about whether it can solve the problem we want to solve and\/or whether it solves a subset only, and \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e162\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e whether we're fine with that, or alternatively, I may've misunderstood the problem, for which a real-time example would help.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e163\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:57 < tgr> yeah, I should have said "Krinkle's doubts", my bad\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e164\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:57 < tgr> it was a good point\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e165\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:58 < DanielK_WMDE> Krinkle: I think you are correct - the proposal, in the general case, is a violation of LSP.\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e166\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:58 < DanielK_WMDE> but I don't see a good alternative\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e167\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:58 < DanielK_WMDE> (also, it's hard to not violate LSP if you don't have type parameters)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e168\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:59 < bawolff> As an aside, when I saw the subject line announcing this meeting, I assumed everyone was talking about how to make UI changes more palatable to the community. Email subjects might want \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e169\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e to be more clear on what this is about in the future (As this topic is much more interesting than the one i thought it was)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e170\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:59 < DanielK_WMDE> ah. "interface changes". I see :)\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e171\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e17:59 < kchapman> sorry bawolff I just took the title of the phab task for the email. I'll keep that in mind in the future\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e172\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e18:00 < tgr> uh, sorry, that reading never occurred to me\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e173\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e18:00 < bawolff> kchapman: no worries, its totally understandable that people wouldn't read it the way I was reading it\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e174\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e18:00 < tgr> might be spending too much time in PHP land\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e175\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e18:00 -!- dannyh [~textual@wikimedia\/DannyH-WMF] has quit [Quit: Computer has gone to sleep.] \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e176\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e18:01 < kchapman> tgr so we are at the hour. Can you put a summary in the phab ticket?\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e177\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e18:01 < tgr> will post a summary to the task\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e178\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e18:01 < kchapman> Excellent. Thanks all, the meeting is closed\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cbr \/\u003e\nDaniels's example from the etherpad: \u003cdiv class=\"paste-embed\"\u003e\u003cdiv class=\"paste-embed-head\"\u003e\u003ca href=\"\/P7112\"\u003eP7112 Interface versioning example for T193613\u003c\/a\u003e\u003c\/div\u003e\u003cdiv class=\"paste-embed-body\" style=\"max-height: 27.6em;\"\u003e\u003cdiv class=\"phabricator-source-code-container\"\u003e\u003ctable class=\"phabricator-source-code-view remarkup-code PhabricatorMonospaced\" data-sigil=\"phabricator-source has-symbols\" data-meta=\"0_4\"\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e1\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003einterface\u003c\/span\u003e \u003cspan class=\"no\"\u003eFoo\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e2\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003efrob\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e\u003cspan class=\"nv\"\u003e$x\u003c\/span\u003e\u003cspan class=\"o\"\u003e);\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ should become frob($x, $y = '')\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e3\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e4\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e5\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003eclass\u003c\/span\u003e \u003cspan class=\"no\"\u003eMyFoo\u003c\/span\u003e \u003cspan class=\"k\"\u003eimplements\u003c\/span\u003e \u003cspan class=\"nc\" data-symbol-name=\"Foo\"\u003eFoo\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ in an extension\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e6\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003efrob\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e\u003cspan class=\"nv\"\u003e$x\u003c\/span\u003e\u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ must not break\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e7\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e...\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e8\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e9\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e10\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e11\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003eclass\u003c\/span\u003e \u003cspan class=\"no\"\u003eXyzzy\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e12\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003esizzle\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"no\"\u003eFoo\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e \u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e13\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e\u003cspan class=\"o\"\u003e->\u003c\/span\u003e\u003cspan class=\"na\" data-symbol-name=\"frob\"\u003efrob\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"s2\"\u003e"an X"\u003c\/span\u003e \u003cspan class=\"o\"\u003e);\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ wants to call $foo->frob( "an X", "some Y" );\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e14\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e15\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e16\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e17\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003eclass\u003c\/span\u003e \u003cspan class=\"no\"\u003eWhammo\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e18\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003edrizzle\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"no\"\u003eFoo\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e \u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e19\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e\u003cspan class=\"o\"\u003e->\u003c\/span\u003e\u003cspan class=\"na\" data-symbol-name=\"frob\"\u003efrob\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"s2\"\u003e"another x"\u003c\/span\u003e \u003cspan class=\"o\"\u003e);\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ should still work\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e20\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e21\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e22\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e23\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e------------------------------------------------------------------------------------------------\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e24\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e25\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"c\"\u003e\/\/ @deprecated use Foo2 instead\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e26\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003einterface\u003c\/span\u003e \u003cspan class=\"no\"\u003eFoo\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e27\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"c\"\u003e\/\/ Render a dot $x from the left ($y is always 0, not configurable)\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e28\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003efrobDot\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e\u003cspan class=\"nv\"\u003e$x\u003c\/span\u003e\u003cspan class=\"o\"\u003e);\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ @deprecated use Foo2::foo2 instead!\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e29\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e30\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e31\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003einterface\u003c\/span\u003e \u003cspan class=\"no\"\u003eFoo2\u003c\/span\u003e \u003cspan class=\"k\"\u003eextends\u003c\/span\u003e \u003cspan class=\"nc\" data-symbol-name=\"Foo\"\u003eFoo\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e32\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"c\"\u003e\/\/ Render a dot at $x\/$y coord\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e33\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"c\"\u003e\/\/ Document that some implementations may not support $y !== 0\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e34\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003efrobDotAt\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e\u003cspan class=\"nv\"\u003e$x\u003c\/span\u003e\u003cspan class=\"o\"\u003e,\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$y\u003c\/span\u003e \u003cspan class=\"o\"\u003e=\u003c\/span\u003e \u003cspan class=\"mi\"\u003e0\u003c\/span\u003e\u003cspan class=\"o\"\u003e);\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e35\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e36\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e37\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003eclass\u003c\/span\u003e \u003cspan class=\"no\"\u003eMyFoo\u003c\/span\u003e \u003cspan class=\"k\"\u003eimplements\u003c\/span\u003e \u003cspan class=\"nc\" data-symbol-name=\"Foo2\"\u003eFoo2\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ in an extension\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e38\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003efrobDot\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e\u003cspan class=\"nv\"\u003e$x\u003c\/span\u003e\u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ implement old interface based on new interface\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e39\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"nv\"\u003e$this\u003c\/span\u003e\u003cspan class=\"o\"\u003e->\u003c\/span\u003e\u003cspan class=\"na\" data-symbol-name=\"frobDotAt\"\u003efrobDotAt\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e\u003cspan class=\"nv\"\u003e$x\u003c\/span\u003e\u003cspan class=\"o\"\u003e,\u003c\/span\u003e \u003cspan class=\"mi\"\u003e0\u003c\/span\u003e\u003cspan class=\"o\"\u003e);\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e40\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e41\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003efrobDotAt\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e\u003cspan class=\"nv\"\u003e$x\u003c\/span\u003e\u003cspan class=\"o\"\u003e,\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$y\u003c\/span\u003e \u003cspan class=\"o\"\u003e=\u003c\/span\u003e \u003cspan class=\"mi\"\u003e0\u003c\/span\u003e\u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e42\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e...\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e43\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e44\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e45\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e46\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003eclass\u003c\/span\u003e \u003cspan class=\"no\"\u003eFoo2Adapter\u003c\/span\u003e \u003cspan class=\"k\"\u003eimplements\u003c\/span\u003e \u003cspan class=\"nc\" data-symbol-name=\"Foo2\"\u003eFoo2\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e47\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003eprivate\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e\u003cspan class=\"o\"\u003e;\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e48\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003epublic\u003c\/span\u003e \u003cspan class=\"no\"\u003efuntion\u003c\/span\u003e \u003cspan class=\"nf\" data-symbol-name=\"__construct\"\u003e__construct\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"no\"\u003eFoo\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e \u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e49\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"nv\"\u003e$this\u003c\/span\u003e\u003cspan class=\"o\"\u003e->\u003c\/span\u003e\u003cspan class=\"na\" data-symbol-name=\"foo\"\u003efoo\u003c\/span\u003e \u003cspan class=\"o\"\u003e=\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e\u003cspan class=\"o\"\u003e;\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e50\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e51\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e52\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003efrobDot\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e\u003cspan class=\"nv\"\u003e$x\u003c\/span\u003e\u003cspan class=\"o\"\u003e,\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$y\u003c\/span\u003e \u003cspan class=\"o\"\u003e=\u003c\/span\u003e \u003cspan class=\"mi\"\u003e0\u003c\/span\u003e\u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ implement new interface based on old interface\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e53\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003eif\u003c\/span\u003e \u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$y\u003c\/span\u003e \u003cspan class=\"o\"\u003e!==\u003c\/span\u003e \u003cspan class=\"mi\"\u003e0\u003c\/span\u003e\u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c\/span\u003e \u003cspan class=\"no\"\u003eooops\u003c\/span\u003e\u003cspan class=\"o\"\u003e!\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ make sure we can ignore the new parameter\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e54\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"nv\"\u003e$this\u003c\/span\u003e\u003cspan class=\"o\"\u003e->\u003c\/span\u003e\u003cspan class=\"na\" data-symbol-name=\"foo\"\u003efoo\u003c\/span\u003e\u003cspan class=\"o\"\u003e->\u003c\/span\u003e\u003cspan class=\"na\" data-symbol-name=\"frobDotAt\"\u003efrobDotAt\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e\u003cspan class=\"nv\"\u003e$x\u003c\/span\u003e\u003cspan class=\"o\"\u003e);\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ ignore $y ?\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e55\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e56\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e57\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e58\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e59\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003eclass\u003c\/span\u003e \u003cspan class=\"no\"\u003eXyzzy\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e60\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003esizzle\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"no\"\u003eFoo\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e \u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ wants to hint against Foo2 eventually\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e61\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"nv\"\u003e$foo2\u003c\/span\u003e \u003cspan class=\"o\"\u003e=\u003c\/span\u003e \u003cspan class=\"nc\" data-symbol-name=\"Foo2Adapter\"\u003eFoo2Adapter\u003c\/span\u003e\u003cspan class=\"o\"\u003e::\u003c\/span\u003e\u003cspan class=\"nf\" data-symbol-context=\"Foo2Adapter\" data-symbol-name=\"newFromFoo\"\u003enewFromFoo\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e \u003cspan class=\"o\"\u003e);\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ this mapping get's pushed up to callers more and more\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e62\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"nv\"\u003e$foo2\u003c\/span\u003e\u003cspan class=\"o\"\u003e->\u003c\/span\u003e\u003cspan class=\"na\" data-symbol-name=\"from2\"\u003efrom2\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"s2\"\u003e"an X"\u003c\/span\u003e\u003cspan class=\"o\"\u003e,\u003c\/span\u003e \u003cspan class=\"s2\"\u003e"some Y"\u003c\/span\u003e \u003cspan class=\"o\"\u003e);\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e63\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e64\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e65\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e66\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"c\"\u003e\/\/ stop calling Foo::frob \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e67\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e68\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003eclass\u003c\/span\u003e \u003cspan class=\"no\"\u003eXyzzy\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e69\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003esizzle\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"no\"\u003eFoo2\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e \u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ callers must now do the Foo2Adapter thing\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e70\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e\u003cspan class=\"o\"\u003e->\u003c\/span\u003e\u003cspan class=\"na\" data-symbol-name=\"frob2\"\u003efrob2\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"s2\"\u003e"an X"\u003c\/span\u003e\u003cspan class=\"o\"\u003e,\u003c\/span\u003e \u003cspan class=\"s2\"\u003e"some Y"\u003c\/span\u003e \u003cspan class=\"o\"\u003e);\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e71\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e72\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e73\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e74\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003eclass\u003c\/span\u003e \u003cspan class=\"no\"\u003eWhammo\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e75\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003edrizzle\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"no\"\u003eFoo2\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e \u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e76\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"nv\"\u003e$foo\u003c\/span\u003e\u003cspan class=\"o\"\u003e->\u003c\/span\u003e\u003cspan class=\"na\" data-symbol-name=\"frob2\"\u003efrob2\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e \u003cspan class=\"s2\"\u003e"another x"\u003c\/span\u003e\u003cspan class=\"o\"\u003e,\u003c\/span\u003e \u003cspan class=\"s2\"\u003e"more y"\u003c\/span\u003e \u003cspan class=\"o\"\u003e);\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ should still work\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e77\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e78\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e79\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e80\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"c\"\u003e\/\/ drop Foo \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e81\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e82\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003einterface\u003c\/span\u003e \u003cspan class=\"no\"\u003eFoo2\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e83\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"c\"\u003e\/\/ Render a dot at $x\/$y coord\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e84\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003efrobDotAt\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e\u003cspan class=\"nv\"\u003e$x\u003c\/span\u003e\u003cspan class=\"o\"\u003e,\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$y\u003c\/span\u003e \u003cspan class=\"o\"\u003e=\u003c\/span\u003e \u003cspan class=\"mi\"\u003e0\u003c\/span\u003e\u003cspan class=\"o\"\u003e);\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e85\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e86\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e87\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"c\"\u003e\/\/ remove B\/C methods\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e88\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"k\"\u003eclass\u003c\/span\u003e \u003cspan class=\"no\"\u003eMyFoo\u003c\/span\u003e \u003cspan class=\"k\"\u003eimplements\u003c\/span\u003e \u003cspan class=\"nc\" data-symbol-name=\"Foo2\"\u003eFoo2\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e \u003cspan class=\"c\"\u003e\/\/ in an extension\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e89\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"k\"\u003efunction\u003c\/span\u003e \u003cspan class=\"no\"\u003efrobDotAt\u003c\/span\u003e\u003cspan class=\"o\"\u003e(\u003c\/span\u003e\u003cspan class=\"nv\"\u003e$x\u003c\/span\u003e\u003cspan class=\"o\"\u003e,\u003c\/span\u003e \u003cspan class=\"nv\"\u003e$y\u003c\/span\u003e \u003cspan class=\"o\"\u003e=\u003c\/span\u003e \u003cspan class=\"mi\"\u003e0\u003c\/span\u003e\u003cspan class=\"o\"\u003e)\u003c\/span\u003e \u003cspan class=\"o\"\u003e{\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e90\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e...\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e91\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e \u003cspan class=\"o\"\u003e}\u003c\/span\u003e\n\u003c\/td\u003e\u003c\/tr\u003e\u003ctr\u003e\u003cth class=\"phabricator-source-line\"\u003e\u003cspan\u003e92\u003c\/span\u003e\u003c\/th\u003e\u003ctd class=\"phabricator-source-code\"\u003e\u003cspan class=\"o\"\u003e}\u003c\/span\u003e\u003c\/td\u003e\u003c\/tr\u003e\u003c\/table\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/p\u003e\n\n\u003cp\u003eSome of the main points raised:\u003c\/p\u003e\n\n\u003cul class=\"remarkup-list\"\u003e\n\u003cli class=\"remarkup-list-item\"\u003eShould we use interfaces at all? We should probably articulate the benefits we expect from them.\u003c\/li\u003e\n\u003cli class=\"remarkup-list-item\"\u003eWe should use realistic examples (e.g. from past refactorings) to avoid getting stuck on the programming language side of a task that does not make any sense on the business logic side anyway.\u003c\/li\u003e\n\u003cli class=\"remarkup-list-item\"\u003eWe should look at how other framworks deal with this.\u003c\/li\u003e\n\u003cli class=\"remarkup-list-item\"\u003eThe interface versioning option was the most popular (or at least the most discussed).\u003c\/li\u003e\n\u003c\/ul\u003e\u003c\/div\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_129\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/woaup5gfhgyt3xpvwi4f\/PHID-FILE-xcnwlpurjz3rsuiv56td\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/Tgr\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4196181\" id=\"4196181\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-link phui-timeline-icon\" data-meta=\"0_128\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Tgr\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_29\"\u003eTgr\u003c\/a\u003e mentioned this in \u003ca href=\"\/P7112\" class=\"phui-handle\" data-sigil=\"hovercard\" data-meta=\"0_30\"\u003eP7112 Interface versioning example for T193613\u003c\/a\u003e.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4196181\" data-sigil=\"has-tooltip\" data-meta=\"0_127\"\u003e\u003cspan class=\"screen-only\"\u003eMay 10 2018, 7:04 AM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-10 07:04:52 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_132\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/woaup5gfhgyt3xpvwi4f\/PHID-FILE-xcnwlpurjz3rsuiv56td\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/Tgr\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4196918\" id=\"4196918\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-pencil phui-timeline-icon\" data-meta=\"0_131\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Tgr\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_31\"\u003eTgr\u003c\/a\u003e updated the task description. \u003ca href=\"\/transactions\/detail\/PHID-XACT-TASK-5e7grzeg7lw6y6w\/\" data-sigil=\"workflow\"\u003e(Show Details)\u003c\/a\u003e\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4196918\" data-sigil=\"has-tooltip\" data-meta=\"0_130\"\u003e\u003cspan class=\"screen-only\"\u003eMay 10 2018, 11:42 AM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-10 11:42:44 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_135\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/v5wmnfiaelrd6nztxd3a\/PHID-FILE-s57znldbv3qchtewuryd\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/daniel\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4213191\" id=\"4213191\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-link phui-timeline-icon\" data-meta=\"0_134\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/daniel\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_32\"\u003edaniel\u003c\/a\u003e mentioned this in \u003ca href=\"\/T194925\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_33\"\u003eT194925: Public TechCom Meeting\u003c\/a\u003e.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4213191\" data-sigil=\"has-tooltip\" data-meta=\"0_133\"\u003e\u003cspan class=\"screen-only\"\u003eMay 18 2018, 10:41 AM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-18 10:41:34 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell\" data-sigil=\"transaction anchor-container\" data-meta=\"0_138\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/q4xtskw4ul5dvrupkmqs\/PHID-FILE-ezxrezgeehrb4vjobxgz\/profile)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/Krinkle\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4217325\" id=\"4217325\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-columns phui-timeline-icon\" data-meta=\"0_137\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Krinkle\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_34\"\u003eKrinkle\u003c\/a\u003e moved this task from \u003ca href=\"\/project\/board\/52\/\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_35\"\u003eRequest IRC meeting\u003c\/a\u003e to \u003ca href=\"\/project\/board\/52\/\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_36\"\u003eUnder discussion\u003c\/a\u003e on the \u003ca href=\"\/tag\/techcom-rfc\/\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_37\"\u003eTechCom-RFC\u003c\/a\u003e board.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4217325\" data-sigil=\"has-tooltip\" data-meta=\"0_136\"\u003e\u003cspan class=\"screen-only\"\u003eMay 19 2018, 3:27 PM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-05-19 15:27:50 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-spacer\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-shell phui-timeline-green\" data-sigil=\"transaction anchor-container\" data-meta=\"0_144\"\u003e\u003cdiv class=\"phui-timeline-event-view phui-timeline-minor-event\"\u003e\u003cdiv class=\"phui-timeline-content\"\u003e\u003ca style=\"background-image: url(https:\/\/phab.wmfusercontent.org\/file\/data\/gbu653eyfo7oa47vsdgw\/PHID-FILE-s42r4m5mkqoddhjki7bu\/467a70-alphanumeric_lato-white_V.png-255%2C255%2C255%2C0.7.png)\" class=\"visual-only phui-timeline-image\" href=\"\/p\/Vvjjkkii\/\" aria-hidden=\"true\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-wedge\" style=\"\"\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-group\"\u003e\u003ca name=\"4355040\" id=\"4355040\" class=\"phabricator-anchor-view\"\u003e\u003c\/a\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-pencil phui-timeline-icon\" data-meta=\"0_140\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Vvjjkkii\/\" class=\"phui-handle handle-availability-disabled phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_38\"\u003e\u003cspan class=\"perfect-circle\"\u003e\u2022\u003c\/span\u003e Vvjjkkii\u003c\/a\u003e renamed this task from \u003cspan class=\"phui-timeline-value\"\u003eCome up with a strategy for handling interface changes\u003c\/span\u003e to \u003cspan class=\"phui-timeline-value\"\u003e6sdaaaaaaa\u003c\/span\u003e.\u003cspan class=\"phui-timeline-extra\"\u003e\u003ca href=\"#4355040\" data-sigil=\"has-tooltip\" data-meta=\"0_139\"\u003e\u003cspan class=\"screen-only\"\u003eJul 1 2018, 1:13 AM\u003c\/span\u003e\u003cspan class=\"print-only\" aria-hidden=\"true\"\u003e2018-07-01 01:13:12 (UTC+0)\u003c\/span\u003e\u003c\/a\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill fill-has-color phui-timeline-icon-fill-green\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-arrow-right phui-timeline-icon\" data-meta=\"0_141\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Vvjjkkii\/\" class=\"phui-handle handle-availability-disabled phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_39\"\u003e\u003cspan class=\"perfect-circle\"\u003e\u2022\u003c\/span\u003e Vvjjkkii\u003c\/a\u003e triaged this task as \u003cspan class=\"phui-timeline-value\"\u003eHigh\u003c\/span\u003e priority.\u003c\/div\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-link phui-timeline-icon\" data-meta=\"0_142\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Vvjjkkii\/\" class=\"phui-handle handle-availability-disabled phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_40\"\u003e\u003cspan class=\"perfect-circle\"\u003e\u2022\u003c\/span\u003e Vvjjkkii\u003c\/a\u003e added projects: \u003ca href=\"\/tag\/checkuser\/\" class=\"phui-handle\" data-sigil=\"hovercard\" data-meta=\"0_41\"\u003eCheckUser\u003c\/a\u003e, \u003ca href=\"\/project\/view\/2557\/\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_42\"\u003eConnected-Open-Heritage-Batch-uploads (RA\u00c4-KMB_1_2017-02)\u003c\/a\u003e, \u003ca href=\"\/tag\/tamil-sites\/\" class=\"phui-handle\" data-sigil=\"hovercard\" data-meta=\"0_43\"\u003eTamil-Sites\u003c\/a\u003e, \u003ca href=\"\/tag\/gamepress\/\" class=\"phui-handle\" data-sigil=\"hovercard\" data-meta=\"0_44\"\u003eGamepress\u003c\/a\u003e, \u003ca href=\"\/tag\/hashtags\/\" class=\"phui-handle\" data-sigil=\"hovercard\" data-meta=\"0_45\"\u003eHashtags\u003c\/a\u003e, \u003ca href=\"\/tag\/jade\/\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_46\"\u003eJade\u003c\/a\u003e, \u003ca href=\"\/tag\/kartoeditor\/\" class=\"phui-handle\" data-sigil=\"hovercard\" data-meta=\"0_47\"\u003eKartoEditor\u003c\/a\u003e, \u003ca href=\"\/tag\/language-2018-apr-june\/\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_48\"\u003eLanguage-2018-Apr-June\u003c\/a\u003e, \u003ca href=\"\/tag\/new-editor-experiences\/\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_49\"\u003eNew-Editor-Experiences\u003c\/a\u003e, \u003ca href=\"\/tag\/mail\/\" class=\"phui-handle\" data-sigil=\"hovercard\" data-meta=\"0_50\"\u003eMail\u003c\/a\u003e, \u003ca href=\"\/tag\/tcb-team_now_wmde-techwish\/\" class=\"phui-handle handle-status-closed\" data-sigil=\"hovercard\" data-meta=\"0_51\"\u003eTCB-Team (now WMDE-TechWish)\u003c\/a\u003e.\u003c\/div\u003e\u003cdiv class=\"phui-timeline-title phui-timeline-title-with-icon\"\u003e\u003cspan class=\"phui-timeline-icon-fill\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-user-times phui-timeline-icon\" data-meta=\"0_143\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\u003c\/span\u003e\u003ca href=\"\/p\/Vvjjkkii\/\" class=\"phui-handle handle-availability-disabled phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_52\"\u003e\u003cspan class=\"perfect-circle\"\u003e\u2022\u003c\/span\u003e Vvjjkkii\u003c\/a\u003e removed a subscriber: \u003ca href=\"\/p\/Aklapper\/\" class=\"phui-handle phui-link-person\" data-sigil=\"hovercard\" data-meta=\"0_53\"\u003eAklapper\u003c\/a\u003e.\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e\u003c\/div\u003e"},"javelin_metadata":[{"hovercardSpec":{"objectPHID":"PHID-USER-a6p24cvyblhfzc7we7nc"}},{"hovercardSpec":{"objectPHID":"PHID-TASK-5dcfm3ohx3a3mqdooc4r"}},{"hovercardSpec":{"objectPHID":"PHID-USER-a6p24cvyblhfzc7we7nc","contextPHID":"PHID-TASK-5dcfm3ohx3a3mqdooc4r"}},{"uri":"","symbols":null},{"uri":"","symbols":null},{"hovercardSpec":{"objectPHID":"PHID-APPS-PhabricatorHeraldApplication"}},[],{"hovercardSpec":{"objectPHID":"PHID-USER-hgn5uw2jafgjgfvxibhh"}},{"phid":"PHID-XACT-TASK-uhuvmorvzl26bfe"},{"hovercardSpec":{"objectPHID":"PHID-USER-5dqihbanu3caaj7pigif"}},{"hovercardSpec":{"objectPHID":"PHID-USER-a3ndrbmqqq7sb7olfps4"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-fc6tzpgo4uo33xqvhtdj"}},{"hovercardSpec":{"objectPHID":"PHID-USER-5dqihbanu3caaj7pigif"}},{"phid":"PHID-XACT-TASK-j52u4aptvsvumuz"},{"hovercardSpec":{"objectPHID":"PHID-USER-5dqihbanu3caaj7pigif"}},{"hovercardSpec":{"objectPHID":"PHID-TASK-n7rpjwtyv3rrpvryyult"}},{"hovercardSpec":{"objectPHID":"PHID-USER-a3ndrbmqqq7sb7olfps4"}},{"hovercardSpec":{"objectPHID":"PHID-PCOL-gdnvii2tziibym5uf7pi"}},{"hovercardSpec":{"objectPHID":"PHID-PCOL-bxvivcbte6rnclddqyob"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-fc6tzpgo4uo33xqvhtdj"}},{"phid":"PHID-XACT-TASK-2kejuruetophgzf"},{"hovercardSpec":{"objectPHID":"PHID-USER-a3ndrbmqqq7sb7olfps4"}},{"hovercardSpec":{"objectPHID":"PHID-USER-khiuzivvgcimpgvedbzf"}},{"hovercardSpec":{"objectPHID":"PHID-USER-732lqsmz4v6bss3kln2v"}},{"hovercardSpec":{"objectPHID":"PHID-USER-d2tiurktk2jgxzcpd2jw"}},{"hovercardSpec":{"objectPHID":"PHID-USER-a6p24cvyblhfzc7we7nc"}},{"phid":"PHID-XACT-TASK-f3nydukpqp4xa6p"},{"hovercardSpec":{"objectPHID":"PHID-USER-a6p24cvyblhfzc7we7nc"}},{"phid":"PHID-XACT-TASK-gs72vhyegzdc2ou"},{"hovercardSpec":{"objectPHID":"PHID-USER-a6p24cvyblhfzc7we7nc"}},{"hovercardSpec":{"objectPHID":"PHID-PSTE-dw7eh3py6tcmm5hcilyi"}},{"hovercardSpec":{"objectPHID":"PHID-USER-a6p24cvyblhfzc7we7nc"}},{"hovercardSpec":{"objectPHID":"PHID-USER-5dqihbanu3caaj7pigif"}},{"hovercardSpec":{"objectPHID":"PHID-TASK-nvwfvvf3ehd2qajj6vyr"}},{"hovercardSpec":{"objectPHID":"PHID-USER-sai77mtxmpqnm6pycyvz"}},{"hovercardSpec":{"objectPHID":"PHID-PCOL-bxvivcbte6rnclddqyob"}},{"hovercardSpec":{"objectPHID":"PHID-PCOL-oa6xrkbjkdkxrcft3gwx"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-fc6tzpgo4uo33xqvhtdj"}},{"hovercardSpec":{"objectPHID":"PHID-USER-4f6g67fxmrb2t5z7dzky"}},{"hovercardSpec":{"objectPHID":"PHID-USER-4f6g67fxmrb2t5z7dzky"}},{"hovercardSpec":{"objectPHID":"PHID-USER-4f6g67fxmrb2t5z7dzky"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-clwtwgdwe3z4zm24wfzp"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-mwjqhs3emwj3w52bbt6s"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-ohhlvzggtc75tqba6rof"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-hewjqnqvdffs4aj6ulxh"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-e5iv63qha3h73d6mmcdr"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-5bhzhy2sfove2cz56aiu"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-gqelrt5sz46k4qy7i75r"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-e5jsd437ommc7emml7wd"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-tlkvo4xt3veuo4i2akcq"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-iwl7ucugidn6j6bvitax"}},{"hovercardSpec":{"objectPHID":"PHID-PROJ-ptnfbfyq36kkebaxugcz"}},{"hovercardSpec":{"objectPHID":"PHID-USER-4f6g67fxmrb2t5z7dzky"}},{"hovercardSpec":{"objectPHID":"PHID-USER-hgn5uw2jafgjgfvxibhh"}},{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-agwkqt6oxmtisfy","anchor":"4174041"},{"tip":"Via Herald"},[],{"phid":"PHID-XACT-TASK-rdyxxaz5xopbsnq","anchor":"4174050"},{"targetID":"UQ0_1","uri":"\/transactions\/quote\/PHID-XACT-TASK-uhuvmorvzl26bfe\/","ref":"T193613#4174100"},[],{"anchor":"4174100"},[],{"items":"\u003cul class=\"phabricator-action-list-view \"\u003e\u003cli id=\"UQ0_1\" class=\"phabricator-action-view phabricator-action-view-href action-has-icon\" style=\"\"\u003e\u003ca href=\"#\" class=\"phabricator-action-view-item\" data-sigil=\"transaction-quote\" data-meta=\"0_60\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-quote-left phabricator-action-view-icon\" data-meta=\"0_61\" aria-hidden=\"true\"\u003e\u003c\/span\u003eQuote Comment\u003c\/a\u003e\u003c\/li\u003e\u003cli id=\"UQ0_3\" class=\"phabricator-action-view phabricator-action-view-href action-has-icon\" style=\"\"\u003e\u003ca href=\"\/transactions\/raw\/PHID-XACT-TASK-uhuvmorvzl26bfe\/\" class=\"phabricator-action-view-item\" data-sigil=\"transaction-raw\" data-meta=\"0_62\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-code phabricator-action-view-icon\" data-meta=\"0_63\" aria-hidden=\"true\"\u003e\u003c\/span\u003eView Raw Remarkup\u003c\/a\u003e\u003c\/li\u003e\u003c\/ul\u003e"},[],{"tip":"Via Web"},[],{"tip":"Nerd Sniper","align":"E","size":300},[],{"phid":"PHID-XACT-TASK-uhuvmorvzl26bfe","anchor":"4174100"},{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-wbgofeb57pjm7bo","anchor":"4180560"},{"targetID":"UQ0_1","uri":"\/transactions\/quote\/PHID-XACT-TASK-j52u4aptvsvumuz\/","ref":"T193613#4181450"},[],{"anchor":"4181450"},[],{"items":"\u003cul class=\"phabricator-action-list-view \"\u003e\u003cli id=\"UQ0_5\" class=\"phabricator-action-view phabricator-action-view-href action-has-icon\" style=\"\"\u003e\u003ca href=\"#\" class=\"phabricator-action-view-item\" data-sigil=\"transaction-quote\" data-meta=\"0_74\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-quote-left phabricator-action-view-icon\" data-meta=\"0_75\" aria-hidden=\"true\"\u003e\u003c\/span\u003eQuote Comment\u003c\/a\u003e\u003c\/li\u003e\u003cli id=\"UQ0_7\" class=\"phabricator-action-view phabricator-action-view-href action-has-icon\" style=\"\"\u003e\u003ca href=\"\/transactions\/raw\/PHID-XACT-TASK-j52u4aptvsvumuz\/\" class=\"phabricator-action-view-item\" data-sigil=\"transaction-raw\" data-meta=\"0_76\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-code phabricator-action-view-icon\" data-meta=\"0_77\" aria-hidden=\"true\"\u003e\u003c\/span\u003eView Raw Remarkup\u003c\/a\u003e\u003c\/li\u003e\u003c\/ul\u003e"},[],{"tip":"Via Web"},[],{"tip":"Nerd Sniper","align":"E","size":300},[],{"phid":"PHID-XACT-TASK-j52u4aptvsvumuz","anchor":"4181450"},{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-cs6z2r6zmfzapkz","anchor":"4186548"},{"targetID":"UQ0_1","uri":"\/transactions\/quote\/PHID-XACT-TASK-2kejuruetophgzf\/","ref":"T193613#4187793"},[],{"anchor":"4187793"},[],{"items":"\u003cul class=\"phabricator-action-list-view \"\u003e\u003cli id=\"UQ0_9\" class=\"phabricator-action-view phabricator-action-view-href action-has-icon\" style=\"\"\u003e\u003ca href=\"#\" class=\"phabricator-action-view-item\" data-sigil=\"transaction-quote\" data-meta=\"0_88\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-quote-left phabricator-action-view-icon\" data-meta=\"0_89\" aria-hidden=\"true\"\u003e\u003c\/span\u003eQuote Comment\u003c\/a\u003e\u003c\/li\u003e\u003cli id=\"UQ0_11\" class=\"phabricator-action-view phabricator-action-view-href action-has-icon\" style=\"\"\u003e\u003ca href=\"\/transactions\/raw\/PHID-XACT-TASK-2kejuruetophgzf\/\" class=\"phabricator-action-view-item\" data-sigil=\"transaction-raw\" data-meta=\"0_90\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-code phabricator-action-view-icon\" data-meta=\"0_91\" aria-hidden=\"true\"\u003e\u003c\/span\u003eView Raw Remarkup\u003c\/a\u003e\u003c\/li\u003e\u003c\/ul\u003e"},[],{"tip":"Via Web"},[],[],{"tip":"W3C AC rep","align":"E","size":300},[],{"phid":"PHID-XACT-TASK-haexjotcrwgtrur","anchor":"4187793"},{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-bkqdgg4shjiz246","anchor":"4189177"},{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-ta7s3ljanpsvblb","anchor":"4189262"},{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-pafnjey77mor6at","anchor":"4191899"},{"targetID":"UQ0_1","uri":"\/transactions\/quote\/PHID-XACT-TASK-f3nydukpqp4xa6p\/","ref":"T193613#4195319"},[],{"anchor":"4195319"},[],{"items":"\u003cul class=\"phabricator-action-list-view \"\u003e\u003cli id=\"UQ0_13\" class=\"phabricator-action-view phabricator-action-view-href action-has-icon\" style=\"\"\u003e\u003ca href=\"#\" class=\"phabricator-action-view-item\" data-sigil=\"transaction-quote\" data-meta=\"0_109\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-quote-left phabricator-action-view-icon\" data-meta=\"0_110\" aria-hidden=\"true\"\u003e\u003c\/span\u003eQuote Comment\u003c\/a\u003e\u003c\/li\u003e\u003cli id=\"UQ0_15\" class=\"phabricator-action-view phabricator-action-view-href action-has-icon\" style=\"\"\u003e\u003ca href=\"\/transactions\/raw\/PHID-XACT-TASK-f3nydukpqp4xa6p\/\" class=\"phabricator-action-view-item\" data-sigil=\"transaction-raw\" data-meta=\"0_111\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-code phabricator-action-view-icon\" data-meta=\"0_112\" aria-hidden=\"true\"\u003e\u003c\/span\u003eView Raw Remarkup\u003c\/a\u003e\u003c\/li\u003e\u003c\/ul\u003e"},[],{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-f3nydukpqp4xa6p","anchor":"4195319"},{"targetID":"UQ0_1","uri":"\/transactions\/quote\/PHID-XACT-TASK-gs72vhyegzdc2ou\/","ref":"T193613#4195628"},[],{"anchor":"4195628"},[],{"items":"\u003cul class=\"phabricator-action-list-view \"\u003e\u003cli id=\"UQ0_17\" class=\"phabricator-action-view phabricator-action-view-href action-has-icon\" style=\"\"\u003e\u003ca href=\"#\" class=\"phabricator-action-view-item\" data-sigil=\"transaction-quote\" data-meta=\"0_118\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-quote-left phabricator-action-view-icon\" data-meta=\"0_119\" aria-hidden=\"true\"\u003e\u003c\/span\u003eQuote Comment\u003c\/a\u003e\u003c\/li\u003e\u003cli id=\"UQ0_19\" class=\"phabricator-action-view phabricator-action-view-href action-has-icon\" style=\"\"\u003e\u003ca href=\"\/transactions\/raw\/PHID-XACT-TASK-gs72vhyegzdc2ou\/\" class=\"phabricator-action-view-item\" data-sigil=\"transaction-raw\" data-meta=\"0_120\"\u003e\u003cspan class=\"visual-only phui-icon-view phui-font-fa fa-code phabricator-action-view-icon\" data-meta=\"0_121\" aria-hidden=\"true\"\u003e\u003c\/span\u003eView Raw Remarkup\u003c\/a\u003e\u003c\/li\u003e\u003c\/ul\u003e"},[],{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-gs72vhyegzdc2ou","anchor":"4195628"},{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-elgqlszk3nutnv6","anchor":"4196181"},{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-5e7grzeg7lw6y6w","anchor":"4196918"},{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-bfkhw2kremsdbys","anchor":"4213191"},{"tip":"Via Web"},[],{"phid":"PHID-XACT-TASK-5iyfutnvd3l2zs7","anchor":"4217325"},{"tip":"Via Web"},[],[],[],[],{"phid":"PHID-XACT-TASK-p7eq45st5u3tjn6","anchor":"4355040"}],"javelin_behaviors":{"phui-hovercards":[],"repository-crossreference":[],"phabricator-watch-anchor":[],"phabricator-tooltips":[],"phui-dropdown-menu":[]},"javelin_resources":["https:\/\/phab.wmfusercontent.org\/res\/defaultX\/phabricator\/2eeda9e0\/core.pkg.js","https:\/\/phab.wmfusercontent.org\/res\/defaultX\/phabricator\/98e6504a\/rsrc\/externals\/javelin\/core\/init.js","https:\/\/phab.wmfusercontent.org\/res\/defaultX\/phabricator\/968d91ee\/core.pkg.css","https:\/\/phab.wmfusercontent.org\/res\/defaultX\/phabricator\/b37bcd38\/rsrc\/css\/application\/paste\/paste.css","https:\/\/phab.wmfusercontent.org\/res\/defaultX\/phabricator\/e382316a\/rsrc\/css\/layout\/phabricator-source-code-view.css","https:\/\/phab.wmfusercontent.org\/res\/defaultX\/phabricator\/46fcb3af\/differential.pkg.js","https:\/\/phab.wmfusercontent.org\/res\/defaultX\/phabricator\/666e25ad\/rsrc\/css\/phui\/phui-badge.css"]}