Decoradores em Ruby (migrando do Python)

Eu estou gastando hoje aprendendo Ruby de uma perspectiva Python. Uma coisa que eu não consegui lidar é um equivalente de decoradores. Para reduzir as coisas, estou tentando replicar um decorador Python trivial:

#! /usr/bin/env python

import math

def document(f):
    def wrap(x):
        print "I am going to square", x
        f(x)
    return wrap

@document
def square(x):
    print math.pow(x, 2)

square(5)

Correndo isso me dá:

I am going to square 5
25.0

Então, eu quero criar um quadrado de função (x), mas decorá-lo para que ele me avise sobre o que vai ser quadrado antes de fazê-lo. Vamos nos livrar do açúcar para torná-lo mais básico:

...
def square(x):
    print math.pow(x, 2)
square = document(square)
...

Então, como faço para replicar isso em Ruby? Aqui está minha primeira tentativa:

#! /usr/bin/env ruby

def document(f)
    def wrap(x)
        puts "I am going to square", x
        f(x)
        end
    return wrap
    end

def square(x)
    puts x**2
    end

square = document(square)

square(5)

Rodando isso gera:

./ruby_decorate.rb:8:in `document': wrong number of arguments (0 for 1) (ArgumentError)
    from ./ruby_decorate.rb:15:in `'

O que eu acho, porque parênteses não são obrigatórios e está tomando meu "wrap" de retorno como uma tentativa de "return wrap ()". Não conheço nenhuma maneira de me referir a uma função sem chamá-la.

Eu tentei várias outras coisas, mas nada me deixa longe.

questionAnswers(11)

yourAnswerToTheQuestion