In software engineering, it is an old question whether you are “using” a component or whether you are “reusing” it. People tend to use these two terms interchangeably, annoying those among us who are trying to put precise meaning to terms. Alas, I don’t know of a good commonly accepted definition. I only know that “reuse” is an over-used term, mostly because “reusing” has more cache than “using”.
After reading some legal material, I’m wondering whether the copyright lawyers already solved this problem.
In (open source) copyright law, the textbooks distinguish between collective and derivative works. In a collective work, software components are put together as is, possibly with some glue code around them. In a derivative work of some component, the original component is modified (that is, its source code is changed). A derivative work can of course be used as part of a collective work.
To me it seems like a component used as part of a collective work is being used, and a component of which a derivate work is being created is being reused.
Thus, calling functions of some component in a collective work means using that component. Sub-classing a class and using its inheritance interface also means just using that class. Any form of linking or making dynamic calls, even to remote processes, are forms of using the respective component.
You are only reusing some component if you are changing its source code (or maybe some meta data) to adapt it to some unforeseen context. For that, you need to create a derivative of the component, as the lawyers would say. (I realize that lawyers may not agree on such a simple notion of derivative work, but then I’m not asking they decide over use vs. reuse. I’m only saying we should use the distinction between collective and derivate work to decide on use vs. reuse.)
using a component = embedding it in a collective work
reusing a component = creating a derivate (derived) version of it