public Method

Module.module_function(...)

module_function(symbol, ...)     self

Creates module functions for the named methods. These functions may be called with the module as a receiver, and also become available as instance methods to classes that mix in the module. Module functions are copies of the original, and so may be changed independently. The instance-method versions are made private. If used with no arguments, subsequently defined methods become module functions.

module Mod
  def one
    "This is one"
  end
  module_function :one
end
class Cls
  include Mod
  def callOne
    one
  end
end
Mod.one     #=> "This is one"
c = Cls.new
c.callOne   #=> "This is one"
module Mod
  def one
    "This is the new one"
  end
end
Mod.one     #=> "This is one"
c.callOne   #=> "This is the new one"

Source Code

/*
*  call-seq:
*     module_function(symbol, ...)    => self
*  
*  Creates module functions for the named methods. These functions may
*  be called with the module as a receiver, and also become available
*  as instance methods to classes that mix in the module. Module
*  functions are copies of the original, and so may be changed
*  independently. The instance-method versions are made private. If
*  used with no arguments, subsequently defined methods become module
*  functions.
*     
*     module Mod
*       def one
*         "This is one"
*       end
*       module_function :one
*     end
*     class Cls
*       include Mod
*       def callOne
*         one
*       end
*     end
*     Mod.one     #=> "This is one"
*     c = Cls.new
*     c.callOne   #=> "This is one"
*     module Mod
*       def one
*         "This is the new one"
*       end
*     end
*     Mod.one     #=> "This is one"
*     c.callOne   #=> "This is the new one"
*/

static VALUE
rb_mod_modfunc(argc, argv, module)
   int argc;
   VALUE *argv;
   VALUE module;
{
   int i;
   ID id;
   NODE *body;

   if (TYPE(module) != T_MODULE) {
       rb_raise(rb_eTypeError, "module_function must be called for modules");
   }

   secure_visibility(module);
   if (argc == 0) {
       SCOPE_SET(SCOPE_MODFUNC);
       return module;
   }

   set_method_visibility(module, argc, argv, NOEX_PRIVATE);
   for (i=0; i<argc; i++) {
       VALUE m = module;

       id = rb_to_id(argv[i]);
       for (;;) {
           body = search_method(m, id, &m);
           if (body == 0) {
               body = search_method(rb_cObject, id, &m);
           }
           if (body == 0 || body->nd_body == 0) {
               rb_bug("undefined method `%s'; can't happen", rb_id2name(id));
           }
           if (nd_type(body->nd_body) != NODE_ZSUPER) {
               break;                /* normal case: need not to follow 'super' link */
           }
           m = RCLASS(m)->super;
           if (!m) break;
       }
       rb_add_method(rb_singleton_class(module), id, body->nd_body, NOEX_PUBLIC);
   }
   return module;
}
Comments

Have your say
Please use Textile formatting (click here for a cheat sheet). Use <code/> and <pre/> for code samples.
Click here to login with OpenID to to post comments.