I have a variable that I need to pass to a subroutine. It is very possible that the subroutine will not need this variable, and providing the value for the variable is expensive. Is it possible to create a “lazy-loading” object that will only be evaluated if it is actually being used? I cannot change the subroutine itself, so it must still look like a normal Perl scalar to the caller.
Share
You’ll want to look at Data::Lazy and Scalar::Defer. Update: There’s also Data::Thunk and Scalar::Lazy.
I haven’t tried any of these myself, but I’m not sure they work properly for an object. For that, you might try a Moose class that keeps the real object in a lazy attribute which
handlesall the methods that object provides. (This wouldn’t work if the subroutine does anisacheck, though, unless it callsisaas a method, in which case you can override it in your class.)