Posted 9 months ago. Visible to the public. External content.

Subclassing module

Yesterday I stumbled across a talk in which the guy mentioned module sub-classing. I was curious what you can do with it and found his blog post with a cool example. It allows you to inject some state into the module you are including elsewhere. Check it out!

class AttributeAccessor < Module def initialize(name) @name = name end def included(model) super define_accessors end private def define_accessors ivar = "@#{@name}" define_writer(ivar) define_reader(ivar) end def define_writer(ivar) define_method("#{@name}=") do |value| instance_variable_set("#{ivar}", value) end end def define_reader(ivar) define_method(@name) do instance_variable_get("#{ivar}") end end end class Book include def title "#{super} + super works!" end end book = book.title = "Module Subclassing Guide" puts book.title

We also have a gem to help you with this: Modularity.
Modularity enhances Ruby's Module so it can be used with traits and partial classes. This allows very simple definition of meta-programming macros like the has_many that you know from Rails.
Modularity also lets you organize large models into multiple source files in a way that is less awkward than using modules.

Growing Rails Applications in Practice
Check out our new e-book:
Learn to structure large Ruby on Rails codebases with the tools you already know and love.

Author of this card:

Andreas Robecke
Last edit:
9 months ago
by Judith Roth
About this deck:
We are makandra and do test-driven, agile Ruby on Rails software development.
License for source code
Posted by Andreas Robecke to makandropedia