Sha256: 877df6459aff1991cf39e879cfcb860e5837c02346ee9669f1dbacb4c9fe937d

Contents?: true

Size: 870 Bytes

Versions: 6

Compression:

Stored size: 870 Bytes

Contents

class ImplementationError < StandardError
end

# namespace to store contracts
module InterfaceContracts
end

class Module

  def implements(*klasses)
    klasses.each do |klass|
      unless klass === Class
        InterfaceContracts.module_eval %Q{
          class ::InterfaceContracts::#{klass} < ::#{klass}; end
          #{klass}.freeze
        }
      end
    end
    ifc_str = '[' + klasses.collect { |k| "InterfaceContracts::#{k.name}" }.join(',') + ']'
    ifm = Module.new
    ifm.module_eval %Q{
      def initialize(*args)
        #{ifc_str}.each do |k|
          umeths = k.public_instance_methods(true) - self.public_methods
          if umeths != []
            raise ImplementationError, self.class.name + " as "  + k.name + "\n" + umeths.sort.join(', ')
          end
        end
        super
      end
    }
    class_eval { include ifm }
  end

end

Version data entries

6 entries across 6 versions & 2 rubygems

Version Path
carats-0.3.0 lib/carat-dev/interface_work/SCRAP/i-contracts.rb
facets-1.4.1 forge/more/contracts.rb
facets-1.4.2 forge/more/contracts.rb
facets-1.4.3 forge/more/contracts.rb
facets-1.4.4 forge/more/contracts.rb
facets-1.4.5 snip/more/contracts.rb