> Should IO behave like value objects?

The current behaviour is what we want to keep (this also now being far on the 
other side
of The Christmas), so I'll close this RFC.

> However, it seems to use .Str rather than .abspath to compare them

Currently, we go through the default Mu `eqv` and so it compares *all* of 
IO::Path's attributes.
The reason `say "foo".IO eqv "/tmp/foo".IO;` compares False is because the 
objects contain
different $.path attributes.

All the other proposals in the ticket talk about different ways of verifying 
the two IO::Path objects
point to the same filesystem object. However, there's no good way of doing that 
while guaranteeing
the comparison will hold true after the comparison (i.e. when the user wishes 
to use that result).
So it's not really a generalizable behaviour that we want to do under the hood, 
but rather something that
the user should be explicitly doing.

- .abspath (now .absolute) doesn't access the filesystem, so two paths with 
different .abspaths can
    still reference the same filesystem object. The user can still use this 
behaviour via smartmatching
- we can kick it up a notch and do .resolve, but by default that will stop as 
soon as it hits an path part
   that doesn't exist, and from that point we're back to the same issue as with 
.absolute
- we can use .resolve with :completely arg, but that will make paths that 
reference non-existent objects
   uncomparable
- but even with paths that do .resolve(:completely) we hit the temporal issue 
Bart mentioned. The filesystem
   condition may change the moment we finish doing our checks, or even in the 
middle of our check, resulting 
   in incorrect answers.

While the same issue exists with methods such as IO::Path.e, I think eqv 
comparison should go further than
just ensuring resolved path point to the same filesystem object, as there are 
cases where it matters. For example,
stringification via .Str method ignores .CWD attribute or stuff like $*CWD 
variable often needs objects with
absolute $.path attributes. So the values of individual attributes are more 
important than what the IO::Path points to.

So in summation, I think the current behaviour of treating IO::Path as any 
other object, as we've been doing
since first release in this case is most desirable behaviour.

Reply via email to