diff options
Diffstat (limited to 'lib/arel/extensions')
-rw-r--r-- | lib/arel/extensions/class.rb | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/arel/extensions/class.rb b/lib/arel/extensions/class.rb index 09e6d86ed4..f37898e7d7 100644 --- a/lib/arel/extensions/class.rb +++ b/lib/arel/extensions/class.rb @@ -1,4 +1,30 @@ class Class + def attributes(*attrs) + @attributes = attrs + attr_reader *attrs + end + + def deriving(*methods) + methods.each { |m| derive m } + end + + def derive(method_name) + methods = { + :initialize => " + def #{method_name}(#{@attributes.join(',')}) + #{@attributes.collect { |a| "@#{a} = #{a}" }.join("\n")} + end + ", + :== => " + def ==(other) + #{name} === other && + #{@attributes.collect { |a| "@#{a} == other.#{a}" }.join(" &&\n")} + end + " + } + class_eval methods[method_name], __FILE__, __LINE__ + end + def hash_on(delegatee) define_method :eql? do |other| self == other |