[Nitro] Facets Aspects problem

transfire at gmail.com transfire at gmail.com
Thu Feb 1 18:11:42 EST 2007



On Feb 1, 5:49 pm, "nya... at gmail.com" <nya... at gmail.com> wrote:
> In trying to reduce the amount of eval'd code in Og I ran across the
> following fascinating snippet in facets/more/aspects.rb:
>
> target.instance_method(m).arity.times { |i| args << "a#{i}" }
>
> Which is fine, unless the method takes a variable number of arguments,
> in which case, the advised version of the method suddenly takes no
> arguments.

Good catch. That has to change.

> Can I suggest:
>
> arity = target.instance_method(m).arity
> if arity < 0
>   (-(arity + 1).times{ |i| args << "a#{i}" }
>   args << "*argv"
> else
>   arity.times { |i| args << "a#{i}" }
> end
>
> Working on a workaround...

Is this even eval'd too? What up with the "a#{i}"? Any wrapped method
can work with:

  (*a, &b)

No matter what the original args are. Hold on, let me look at the
code... Okay try this:

    for m in [methods].flatten
      target.module_eval <<-end_eval, __FILE__, __LINE__
        alias_method :__unwrapped_#{m}, :#{m}
        def #{m}(*a,&b)
          #{gen_advice_code(m, target.advices, :pre)}
          __unwrapped_#{m}(*a,&b)
          #{gen_advice_code(m, target.advices, :post)}
        end
      end_eval
    end

Let me know.

T.



More information about the Nitro-general mailing list