On Thu, May 15, 2025, at 13:56, Stephen Reay wrote:
> 
> 
> 
> > On 15 May 2025, at 16:44, Andreas Hennings <andr...@dqxtech.net> wrote:
> > 
> > On Thu, 15 May 2025 at 08:24, Stephen Reay <php-li...@koalephant.com> 
> > wrote:
> > [..]
> >> 
> >> 
> >> I may be missing something here..
> >> 
> >> So far the issues are "how do we deal with a parameter for the actual 
> >> object, vs new properties to apply",  "should __clone be called before or 
> >> after the changes" and "this won't allow regular readonly properties to be 
> >> modified".
> >> 
> >> Isn't the previous suggestion of passing the new property arguments 
> >> directly to the __clone method the obvious solution to all three problems?
> > 
> > What exactly should happen then?
> > Would the __clone() method be responsible for assigning those properties?
> > Or does the __clone() method get the chance to alter the values before
> > they are assigned?
> > (this would mean they have to be passed by reference)
> > I think this last option is the best, because the values in the array
> > can be changed without any readonly constraints.
> > 
> > Another option I was thinking of would be to call __clone() after the
> > changes are applied, and pass both the original object and the array
> > of changes as first parameter.
> > But I think this is a dead end.
> > 
> > -- Andreas
> > 
> >> 
> >> There's no potential for a conflicting property name, the developer can 
> >> use the new property values in the order they see fit relative to the 
> >> logic in the __clone call, and it's inherently in scope to write to any 
> >> (unlocked during __clone) readonly properties.
> >> 
> >> 
> >> 
> >> Cheers
> >> 
> >> Stephen
> >> 
> >> 
> >> 
> > 
> 
> I would suggest that the __clone method should be directly responsible for 
> making any changes, just as it is now when it comes to deep cloning or 
> resetting values.
> 
> Yes I realise it means developers need to then opt in and provide the 
> functionality to support `clone $foo with(bar: "baz")` or whatever syntax is 
> used. 
> 
> If the properties are public properties, there's nothing stopping someone 
> writing their own clone_with() in userland now;  If someone is using readonly 
> properties I'd suggest they want to specifically manage updates to those 
> properties themselves anyway. 
> 
> Additionally it means "clone with" would be usable for non-public properties 
> at the discretion of the developer writing their code. 
> 
> The mental model is also very clear with this: copy the object in memory, and 
> then call __clone(), with the arguments passed to the clone action - which 
> may be none in the case of code that doesn't accept any clone arguments.  The 
> only change from the current model is that it *may* be passing arguments. 
> 
> Cheers
> 
> Stephen 
> 

When I was working on Records, one of the important things was the ability to 
"hook into" the update that was about to happen. For example, if you have a 
Money type, you'd want to be able to ensure it cannot be negative when updating 
via `with()`. This is super important for ensuring constraints are met during 
the clone.

— Rob

Reply via email to