Posted about 1 year 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.

makandra has been working exclusively with Ruby on Rails since 2007. Our laser focus on a single technology has made us a leader in this space.

Author of this card:

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