The only thing I would change is to let $self be the ref to the closure and use another name for the actual data storage.
This way you always know that $self is the ref to your object. For instance if you want to call a couple of private methods in your constructor after blessing your variable it would be more staightforward to do