On Tue, May 30, 2023, 19:39 Larry Garfield <la...@garfieldtech.com> wrote:

> On Mon, May 29, 2023, at 11:22 PM, Máté Kocsis wrote:
> > To be honest, the current behavior seemed like the natural choice for
> > me, and I didn't really consider to execute the __clone() method after
> the
> > clone assignments.
> > Do you have a use-case in mind when you need to forward-pass information
> to
> > __clone()?
>
> Not a specific one off hand.  It's more a conceptual question.  `with` has
> more contextual awareness than __clone(), so it should have "first crack"
> at the operation, so that if necessary it can make changes that __clone()
> can then respond to.  The inverse doesn't make sense.
>
> The only reason for `with` to come after would be to allow `with` to
> "override" or "undo" something that __clone() did.  Generally speaking, if
> you have to undo something you just did, you shouldn't have done it in the
> first place, so that's a less compelling combination.
>
> This one isn't a deal breaker, but we should be sure to think it through
> as it's kinda hard to reverse later.
>

To me so far also it was natural to assume that __clone is first and only
after that the rest of the operations.
But `with` operations, be it properties assignment or even a closure, would
run in the context of the caller of clone and sometimes this might be run
not from a method of the cloned class.

An example:
There is a class that represents persons of a fictive country/planet.
Each person has many properties but has also a first name and a last name
and there is a rule: the two names must not start with the same letter.
Both names cannot be changed as they are defined readonly.
Creation of new persons can be done using new for new random properties or
using clone to preserve existing properties. But in both cases the first
name and last name are randomly chosen.
If we want to control the last name value during clone that would be
possible using the `with` operation but the logic to allocate a first name
will only happen in `__clone()`method.

To be able to achieve this we must have __clone last, as there we have the
internal validations, operations and also access to private/protected
members that are not accesible from where clone is being called.

Regards,
Alex

Reply via email to