On 9/16/07, Pedro Del Gallego <pedro.delgallego / gmail.com> wrote:
> hi all,
>
> in this (http://pastie.caboo.se/97662 ) code :
>
> module Kernel
>   def expected_argument_list
>     2
>   end
>
>   def before (name)
>      puts :hola
>      define_method(name){
>        if expected_argument_list==1
>         yield :only_one
>        else
>         yield :one,:two
>        end
>      }
>   end
> end
>
> class A
>   before :foo do |*args|
>     puts second
>   end
>
>   before :foo do |first , second|
>     puts second
>   end
> end
>
> a = A.new
> a.foo
>
>  Does anyone know of a way to determine what argument list was
> specified when the block is created?
>
> i mean i want to implement  the function expected_argument_list, to
> return the length of the argument list that the block expected.
> Probably is not possible to do that :(
>
> When are defined the variables of the block, in the class definition
> time, or after the yield call?
>

The block arguments are only known at runtime, since you could do this:
def example
  args = []
  rand(15).times {|i| args << i}
  yield *args
end