So, there is the super function that does what you want with behaviours:
You can also use the using and import directives to extend modules in nicely generic ways:
So you can achieve what you are looking for that way .. buuuuuut ..
I have to say that to me, calling “super” is generally a code smell (not that it is always “wrong”, as in “worst thing one could do”, though ..). Functions are cheap in Elixir, and instead of calling a magical super version of the functions, why not call the actual function you are after? The behaviour can define upload and delete, and the Uploader module can provide a set of helper functions. This allows each implementation of the behaviour to explicitly pick which functions to use. This opens doors like being able to freely compose the set of functionality that makes sense for that specific module .. and if there are common composition patterns, put those compositions in a function that can be called directly .. so you can get explictness, DRY, and flexibility all in one package.
The inheritance straight-jacket of “use your inheritance hierarchy as a code path” encouraged OO is often not the most expressive or flexible approach .. functions are our friends, and they can be called by name ![]()


















