R
Rolf Pedersen
[Note: parts of this message were removed to make it a legal post.]
Hi
I was reading the book "Metaprogramming Ruby" which I found quite good for a
guy trying to improve on his novice Ruby skills.
Parts of the book describes the creation of Class macros, and I got
intrigued by this, and I tried to create a small project to practice a
little bit.
Not that I know that this is a particular good idea in Ruby, I started to
make a small framework to enforce the creation of certain methods.
I call it interfaces, since that's what I know from C#.
Anyway, I soon stumbled into a dead end... as expected ;o)
Here is the code:
module Interface
module Base
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def add_interface_methods(*methods)
methods.each do |method|
(@interface_methods ||= []) << method.to_s
end
end
def implement_interfaces(*interfaces)
(@interfaces = interfaces).each do |interface|
puts "self: " + self.inspect.to_s
end
end
def enforce_interfaces
if not (not_implemented_interface_methods = @interface_methods -
self.instance_methods).empty?
raise RuntimeError, "The following interface methods are not
implemented in class #{self.to_s}:\n " +
not_implemented_interface_methods.inspect
end
end
end
end
end
module Interface
module ILockable
add_interface_methods :lock, :unlock
end
module IDrivable
add_interface_methods :drive, :break
end
end
class MyClass
include Interface::Base
implement_interfaces Interface::ILockable, Interface::IDrivable
# methods and other stuff
enforce_interfaces
end
When I run this I get:
interface.rb:28: undefined method `add_interface_methods' for
Interface::ILockable:Module (NoMethodError)
I do understand why I get this error, but I can't see how to go about fixing
it given that I want it structurally to be along the lines already laid out.
Do not bother to much about the code being bloated or otherwise not in
accordance with "standard Ruby thinking"...
)
And I do realize I didn't have to use the included hook script since I'm
only adding class methods, but it's part of a learning process
)
So, where did I go wrong?
Any input/solution/discussion on this issue is most welcome!
Kind regards,
Rolf
Hi
I was reading the book "Metaprogramming Ruby" which I found quite good for a
guy trying to improve on his novice Ruby skills.
Parts of the book describes the creation of Class macros, and I got
intrigued by this, and I tried to create a small project to practice a
little bit.
Not that I know that this is a particular good idea in Ruby, I started to
make a small framework to enforce the creation of certain methods.
I call it interfaces, since that's what I know from C#.
Anyway, I soon stumbled into a dead end... as expected ;o)
Here is the code:
module Interface
module Base
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def add_interface_methods(*methods)
methods.each do |method|
(@interface_methods ||= []) << method.to_s
end
end
def implement_interfaces(*interfaces)
(@interfaces = interfaces).each do |interface|
puts "self: " + self.inspect.to_s
end
end
def enforce_interfaces
if not (not_implemented_interface_methods = @interface_methods -
self.instance_methods).empty?
raise RuntimeError, "The following interface methods are not
implemented in class #{self.to_s}:\n " +
not_implemented_interface_methods.inspect
end
end
end
end
end
module Interface
module ILockable
add_interface_methods :lock, :unlock
end
module IDrivable
add_interface_methods :drive, :break
end
end
class MyClass
include Interface::Base
implement_interfaces Interface::ILockable, Interface::IDrivable
# methods and other stuff
enforce_interfaces
end
When I run this I get:
interface.rb:28: undefined method `add_interface_methods' for
Interface::ILockable:Module (NoMethodError)
I do understand why I get this error, but I can't see how to go about fixing
it given that I want it structurally to be along the lines already laid out.
Do not bother to much about the code being bloated or otherwise not in
accordance with "standard Ruby thinking"...
And I do realize I didn't have to use the included hook script since I'm
only adding class methods, but it's part of a learning process
So, where did I go wrong?
Any input/solution/discussion on this issue is most welcome!
Kind regards,
Rolf