How do these 'proxy' types work exactly?

Hi, I’m trying to learn to use ruby debug/steep. Take the case of ActiveStorage.

I have an ActiveStorage::Attached::One called ‘content’. If I do “content.methods” or “content.inspect” I won’t see the symbol ‘blob’ or ‘attachment’, but I can do “content.blob” or “content.attachment” and get valid results. I can also do “content.blob_size” and get a blob size, even though it’s only listed explicitly if I do “content.blob.inspect”, and the type checker steep complains when I use ‘content.blob_size’ in my code.

How does this work under the hood? How do I get steep and my IDE to recognize what’s happening?