Created
April 21, 2012 07:00
-
-
Save pasberth/2435010 to your computer and use it in GitHub Desktop.
あるモジュール A の下に宣言されたクラスはすべて A を include するなら、 クラスの宣言を define_class というメソッドを作って行って class_defined が呼ばれるようにしたほうがいいかもしれない
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module NameSpaceMethods | |
def define_class name, superclass=Object, &block | |
Class.allocate.tap do |klass| | |
const_set name, klass | |
klass.send :initialize, superclass, &block | |
module_or_class_defined klass | |
class_defined klass | |
end | |
end | |
def define_module name, &block | |
Module.allocate.tap do |mod| | |
const_set name, mod | |
mod.send :initialize, &block | |
module_or_class_defined mod | |
module_defined mod | |
end | |
end | |
alias namespace define_module | |
def module_or_class_defined module_or_class; end | |
def class_defined klass; end | |
def module_defined mod; end | |
end | |
class Module | |
include NameSpaceMethods | |
end | |
module Kernel | |
[ :namespace, | |
:define_class, | |
:define_module, | |
:class_defined, | |
:module_defined, | |
:module_or_class_defined | |
].each do |method| | |
module_eval(<<-DEFINE) | |
def #{method} *args, &block # def namespace *args, &block | |
Object.send :#{method}, *args, &block # Kernel.send :namespace, *args, &block | |
end # end | |
private :#{method} # private :namespace | |
DEFINE | |
end | |
end | |
module ExampleNameSpace | |
def class_defined klass | |
klass.send :include, ExampleNameSpace | |
end | |
define_class :InnerClass do | |
p ancestors # [ExampleNameSpace::InnerClass, Object, Kernel, BasicObject] | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment