"Lloyd Zusman" <ljz / asfast.com> schrieb im Newsbeitrag
news:m3vf968oa9.fsf / asfast.com...
> I'm wondering if something like this is possible:
>
>   module Intercept
>     def intercept_initialize
>       puts "performing Intercept#intercept_initialize"
>       # somehow call containing class's 'initialize' method here
>     end
>   end
>
>   class Foo
>     def initialize
>       puts "performing Foo#initialize"
>     end
>   end
>
>   class Bar
>     include Intercept
>     def initialize
>       puts "performing Bar#initialize"
>     end
>   end
>
>   puts "instatiating Foo"
>   Foo.new
>   puts "instatiating Bar"
>   Bar.new
>   puts "done"
>
> Desired results:
>
>   instantiating Foo
>   performing Foo#initialize
>   instantiating Bar
>   performing Intercept#intercept_initialize
>   performing Bar#initialize
>   done
>
> In other words, simply by including the "Intercept" module in a class,
> I'd like to intercept that class's call to "initialize" and have the
> Intercept module's code get invoked first, and _then_ the containing
> class's "initialize" method should be called as it normally would.
>
> Is this possible?  If so, how?

The proper way is to use super IMHO:

  module Intercept
    def initialize(*a,&b)
      super
      puts "performing Intercept#intercept_initialize"
      # somehow call containing class's 'initialize' method here
    end
  end

  class Foo
    def initialize
      super
      puts "performing Foo#initialize"
    end
  end

  class Bar
    include Intercept
    def initialize
      super
      puts "performing Bar#initialize"
    end
  end

All other suggested approaches (changing a class's new or using a hook)
are more complicated than necessary IMHO.

Kind regards

    robert