Sha256: 568b0409c535208bd688f5b69c22267b4358d11268b867b24460a421217b380e

Contents?: true

Size: 1.96 KB

Versions: 2

Compression:

Stored size: 1.96 KB

Contents

module MPatch
  module Class

    # get singleton methods to target class without super class methods
    def class_methods
      self.methods - ::Object.methods
    end

    # bind a singleton method to a class object
    def create_class_method(method,&block)
      self.class_eval do
        define_singleton_method method do |*args|
          block.call *args
        end
      end
    end

    # create an instance method
    def create_instance_method(method,&block)
      self.class_eval do
        define_method method do |*args|
          block.call *args
        end
      end
    end

    # Iterates over all subclasses (direct and indirect)
    def each_subclass
      ::ObjectSpace.each_object(::Class) { | candidate |
        begin
          yield candidate if candidate < self
        rescue ::ArgumentError
          # comparison of Class with Class failed (ArgumentError)
        end
      }
    end

    # Returns an Array of subclasses (direct and indirect)
    def subclasses_all
      ret = []
      each_subclass {|c| ret.push c}
      ret
    end

    alias :all_subclasses :subclasses_all

    # Returns an Array of direct subclasses
    def subclasses
      ret = []
      each_subclass {|c| ret.push(c) if c.superclass == self }
      ret
    end
    alias :subclass :subclasses

    # create singleton attribute
    def class_attr_accessor(name)

      ### GET
      begin
        define_method name do
          class_variable_get "@@#{name}"
        end
      end

      ### SET
      begin
        define_method "#{name}=" do |new_val|
          class_variable_set "@@#{name}", new_val
        end
      end

    end

    # create class instance attribute
    def instance_attr_accessor(name)

      ### GET
      begin
        define_method name do
          instance_variable_get "@#{name}"
        end
      end

      ### SET
      begin
        define_method "#{name}=" do |new_val|
          instance_variable_set "@#{name}", new_val
        end
      end

    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
mpatch-2.2.1 lib/mpatch/class.rb
mpatch-2.1.3 lib/mpatch/class.rb