
Andy Gayton wrote: [...]
Its a general solution for re-decorating the return result of methods on decorated objects, which return new instances of themselves. Which is particularly handy for decorating tree node like objects, which can return new child instances.
For example:
root = FilePathNode(FilePath('/tmp')) root = ReadOnly(root) root = ForceUser(root, 'nobody')
root.child('foo') # should return a read only node for /tmp/foo, which creates new files as user nobody.
It'd be awesome to provide support for this in a simpler way.
For what it's worth, bzrlib.transport.decorator provides a similar facility for bzrlib.transport. It's used to implement e.g. ReadonlyTransportDecorator. There's also a ChrootTransport, which is essentially a decorator too (although it doesn't use bzrlib.transport.decorator because the generic decorator facility didn't provide a sane way to track what the root of the chroot should be). We also have lots of decorators just for testing, e.g. FakeNFSTransportDecorator, UnlistableTransportDecorator, FakeVFATTransportDecorator, etc. -Andrew.