#the original definition of class Price
class Price
def initialize(val = 0); @val = val end
attr_accessor :val
end
#tweaks for accepting decorations
class Price
def decos; @decos ||= [] end
def val; decos.inject(@val){ | acc, deco | deco[acc] } end
end
#usage example
price = Price.new(120)
price.decos << ->x{x*2}
price.decos << ->x{x+80}
price.decos << ->x{x*2}
price.decos << ->x{x+200}
p price.val
price.val = 100
p price.val
I3RoZSBvcmlnaW5hbCBkZWZpbml0aW9uIG9mIGNsYXNzIFByaWNlCgpjbGFzcyBQcmljZQogICBkZWYgaW5pdGlhbGl6ZSh2YWwgPSAwKTsgQHZhbCA9IHZhbCBlbmQKICAgYXR0cl9hY2Nlc3NvciA6dmFsCmVuZAoKCiN0d2Vha3MgZm9yIGFjY2VwdGluZyBkZWNvcmF0aW9ucwoKY2xhc3MgUHJpY2UKICAgZGVmIGRlY29zOyBAZGVjb3MgfHw9IFtdIGVuZAogICBkZWYgdmFsOyBkZWNvcy5pbmplY3QoQHZhbCl7IHwgYWNjLCBkZWNvIHwgZGVjb1thY2NdIH0gZW5kCmVuZAoKCiN1c2FnZSBleGFtcGxlCgpwcmljZSA9IFByaWNlLm5ldygxMjApCnByaWNlLmRlY29zIDw8IC0+eHt4KjJ9CnByaWNlLmRlY29zIDw8IC0+eHt4KzgwfQpwcmljZS5kZWNvcyA8PCAtPnh7eCoyfQpwcmljZS5kZWNvcyA8PCAtPnh7eCsyMDB9CnAgcHJpY2UudmFsCnByaWNlLnZhbCA9IDEwMApwIHByaWNlLnZhbA==