Sha256: 7960e1d265e4e32a433f0e51ad01a097aee3924fb7dee93ea2e38f8391d62b06
Contents?: true
Size: 1.26 KB
Versions: 6
Compression:
Stored size: 1.26 KB
Contents
# My attempt at abstracting `acts_as_*` pattern. Need to get rid of `InstanceMethods` # class to make it year 2010 compatible. class Class def acts_as(*args) modules_with_options = [] for arg in args if arg.is_a?(Module) modules_with_options << [arg] elsif arg.is_a?(Hash) raise ArgumentError, "Options without module" unless modules_with_options[-1][0].is_a?(Module) modules_with_options[-1][1] = arg end end klass = self for mod, options in modules_with_options klass.send(:instance_exec, options, &mod::ClassContextProc) if defined?(mod::ClassContextProc) klass.send(:include, mod::InstanceMethods) if defined?(mod::InstanceMethods) klass.extend(mod::ClassMethods) if defined?(mod::ClassMethods) end end end module NeverTooDry ClassContextProc = proc do |options| attr_accessor :some_attr class_eval <<-RUBY def #{options[:meta_method_name]}; end RUBY end module InstanceMethods def instance_method; end end module ClassMethods def class_method; end end end module Dummy; end class C acts_as NeverTooDry, { :meta_method_name => "meta_method" }, Dummy end C.class_method c = C.new c.some_attr = 123 c.meta_method c.instance_method
Version data entries
6 entries across 6 versions & 1 rubygems