I frequently use an OOP hierarchy whose main API is DVR based. Since LabVIEW OOP cannot dynamic dispatch off of DVRs, I typically make two levels of VIs: Core (dynamic dispatch) and Wrapper (DVR with in-place element structure to call Core). The wrapper VIs should have the same description, icons, and terminals (other than switching class object with DVR of class object) as the Core they call. To help speed up my coding, I have made a utility that will automatically create the DVR based wrapper VI based on Core VI in a "pretty" manner.
The utility takes this VI and..... creates this VI to call it via DVR
Core VI
Wrapper VI (Front Panel)
Wrapper VI (Block Diagram)
Requirements
LabVIEW 2019: utilizes the new Arrange VI Window quick-drop plugin
Current Limitations
Only works with 5x3x3x5 terminal pattern (future improvement)
Class terminals are upper corners
Errors are lower corners
Example code from the Example Code Exchange in the NI Community is licensed with the MIT license.