Posted 8 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!

Copy
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 AttributeAccessor.new(:title) def title "#{super} + super works!" end end book = Book.new 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.

Once an application no longer requires constant development, it needs periodic maintenance for stable and secure operation. makandra offers monthly maintenance contracts that let you focus on your business while we make sure the lights stay on.

Author of this card:

Avatar
Andreas Robecke
Last edit:
7 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