You should probably start by separating your concerns into small, extensible pieces that can be easily stitched together and replaced.


    interface Transform {
        Widget widget(LookupData lookupData);
    }

That by itself is a piece

    interface Source {
       LookupData lookupData();
    }

There's your read side effect.

    class WidgetMaker {
        Source source;
        Transform transform;

        Widget widget() {
            return transform.widget(source.lookupData());
        }
    }

There's your composition.

    class Cache implements Source {
        LookupData cache = null;          
        Source upstream;

        LookupData lookupData() {
            if (null == cache) {
                cache = upstream.lookupData();
            }
            return cache;
        }
    }

Now you can put a mini cache in front of any source

... and so on.