MATLAB: Is it possible to dynamically add methods to an object, or to build a generic method that “catches attempts to access nonexistent methods”

dynamical method creationMATLABobject-orientedoop

Dear all,
I have seen similar questions asked serveral times, e.g. here @mathworks and here @stackoverflow, but it never really applies to my context.
Hence my question: is it possible to do one of the following operations (?)
  • Add methods to an object dynamically during instantiation (from the constructor).
  • "Catch attempts to access a nonexistent method" by overloading some method (the way we overload subsasgn()/subsref() for managing indexing).
  • Subclass a given class dynamically, during instantiation (from the constructor). [I am a little less interested in this one, because we cannot subclass all built-ins].
The reason is the following. I built a class that allows users to "extend" existing objects passed to the constructor. To illustrate
>> a = 2 ; % double
>> b = MyClass( a ) ; % double extended
Now I would like to "delegate" whatever method call to double if it is not implemented in MyClass. I can easily manage two situations, that I illustrate with a sin() function/method:
  1. I implement sin() in MyClass, so any sin(b) or b.sin() calls MyClass.sin() which can manage to apply sin() to the double 2. This is not a practicable solution in my case, because I cannot implement all possible methods for all possible "classes-to-extend".
  2. Without implementing MyClass.sin(), I can catch such calls with subsref() and manage the rest. This is again not a working solution, because sin(b) is not caught by subsref(). It seems actually that MATLAB tests whether MyClass/b has a sin() method when we evaluate sin(b) and returns an error if not, instead of trying the call and failing.. (?)
So is there a way to catch sin(b) with a subsref()-like method/overload, or a way to have MATLAB calling a specific method of MyClass/b when calls to nonexistent methods (or tests of existence) are attempted?
Thank you and best regards,
Cedric

Best Answer

No, I don't think it's possible. But I put in an enhancement request for it several years ago.