# price.rb
class Price
def initialize(val = 0); @val = val end
attr_accessor :val
end
# decorate_price.rb
module Decoratable
def decos; @decos ||= [] end
def val; decos.inject(@val){ | acc, deco | deco[acc] } end
end
class Price; prepend Decoratable end
$Double = ->x{x*2}
$Wholesales = ->x,adv{x+adv}.curry
# decorate_price_test.rb
price = Price.new(120)
price.decos << $Double << $Wholesales[80] << $Double << $Wholesales[200]
p price.val
IyBwcmljZS5yYgoKY2xhc3MgUHJpY2UKICAgZGVmIGluaXRpYWxpemUodmFsID0gMCk7IEB2YWwgPSB2YWwgZW5kCiAgIGF0dHJfYWNjZXNzb3IgOnZhbAplbmQKCgojIGRlY29yYXRlX3ByaWNlLnJiCgptb2R1bGUgRGVjb3JhdGFibGUKICAgZGVmIGRlY29zOyBAZGVjb3MgfHw9IFtdIGVuZAogICBkZWYgdmFsOyBkZWNvcy5pbmplY3QoQHZhbCl7IHwgYWNjLCBkZWNvIHwgZGVjb1thY2NdIH0gZW5kCmVuZAoKY2xhc3MgUHJpY2U7IHByZXBlbmQgRGVjb3JhdGFibGUgZW5kCiREb3VibGUgPSAtPnh7eCoyfQokV2hvbGVzYWxlcyA9IC0+eCxhZHZ7eCthZHZ9LmN1cnJ5CgoKIyBkZWNvcmF0ZV9wcmljZV90ZXN0LnJiCgpwcmljZSA9IFByaWNlLm5ldygxMjApCnByaWNlLmRlY29zIDw8ICREb3VibGUgPDwgJFdob2xlc2FsZXNbODBdIDw8ICREb3VibGUgPDwgJFdob2xlc2FsZXNbMjAwXQpwIHByaWNlLnZhbA==