I added additional specs to demonstrate what I mean. 
Caching for extensions will not work if changes will occur in base class `extensions` after first call to descendant class `extensions` and this is a reason why I'm calculating them every time and can't just do `extensions << extension` in `register_extension`.
Also, about solution suggested by @dkubb - I tried this and it doesn't work. AFAIK, it is only viable for instances, not for `class` and `superclass`.
About `inherited` hook - it will only work for descendants of class who actually extend `Extendable` module and in any case we need other place to initialize `@extensions` for base class itself. Of course, we can do it every time when base class inherited, but it looks dirty:
``` ruby
   def inherited(descendant)
      descendant.instance_variable_set(:@inherited, Set.new)
      @inherited ||= Set.new
   end
```
Though, I replaced `Array` with `Set` :)