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