Skip to content

Instantly share code, notes, and snippets.

View thiagoa's full-sized avatar

Thiago Araújo Silva thiagoa

  • thoughtbot
  • Natal / RN - Brazil
View GitHub Profile
module Imageable
def self.build(methods)
mod = Module.new do
methods.each do |method|
define_method method do
images.find { |image| image.kind == 'main_image' }
end
end
end
class ModuleFactory < Module
def initialize
define_a_method
end
private
def define_a_method
module_eval do
def my_method
class Imageable < Module
def initialize(has_one: %i(main_image))
has_one.each { |image_kind| define_image_getter(image_kind) }
end
private
def included(model_class)
model_class.has_many :images
end
class Project
include Imageable.new(has_one: %i(main_image secondary_image))
end
project = Project.new
project.main_image #=> <Image kind="main_image" imageable_type="Project">
project.secondary_image #=> <Image kind="secondary_image" imageable_type="Project">
class Imageable < Module
def initialize(has_one: %i(main_image))
has_one.each do |image_kind|
define_method image_kind do
images.find { |image| image.kind == 'main_image' }
end
end
end
def included(model_class)
class ModuleGenerator < Module
def build_methods(methods)
module_eval do
methods.each do |method|
define_method(method) do
puts "#{method} was defined in the instance methods"
end
end
end
end
module OneTwoThree
def one
puts 'one was defined as an instance method'
end
def two
puts 'two was defined as an instance method'
end
def three
OneTwoThree = Module.new do
def one
puts 'one was defined as an instance method'
end
def two
puts 'two was defined as an instance method'
end
def three
class DynamicModuleGenerator < Module
def initialize(methods)
module_eval do
methods.each do |method|
define_method(method) do
puts "#{method} was defined as an instance method"
end
end
end
end
class Module < Object
def module_eval
# Only the language has the magic to make this work...
end
# Imagine there are a bunch of other instance methods here.
# Module.new generates objects that respond to these methods.
end