Dynamic Modules

T

Trans

I would like to discuss the merits/non-merits and the best approach to
implementation of "dynamic modules" --modules that take parameters at
the time of include, thus altering their behavior per include. The
common denominator here is the altered interface of #include:

include AModule, :eek:pt1 => :val1, :eek:pt2 => :val2

Here's a simple example based on the implementation I (and friends) put
together

module Mixin

dynamic_feature do |options|

define_method :hello do
puts "Hello from #{options[:name]}"
end

end

end

class MyClass
include Mixin, :name => 'Ruby'
end

m = MyClass.new
m.hello -> 'Hello from Ruby'

class MyClass2
include Mixin, :name => 'Tom'
end

m = MyClass2.new
m.hello -> 'Hello from Tom'

T.
 
P

Peter C. Verhage

Hi,

Why don't you just create a factory method with the same name as your
class which creates an altered version of your base module? So your
include could be something like the following:

module MyMixin
...
end

def MyMixIn(option1, option2)
MyMixin # but then modified ofcourse...
end

class A
include MyMixin(option1, option2)
end

Regards,

Peter
 
D

Daniel Schierbeck

Trans said:
I would like to discuss the merits/non-merits and the best approach to
implementation of "dynamic modules" --modules that take parameters at
the time of include, thus altering their behavior per include. The
common denominator here is the altered interface of #include:

include AModule, :eek:pt1 => :val1, :eek:pt2 => :val2

Here's a simple example based on the implementation I (and friends) put
together

module Mixin

dynamic_feature do |options|

define_method :hello do
puts "Hello from #{options[:name]}"
end

end

end

class MyClass
include Mixin, :name => 'Ruby'
end

m = MyClass.new
m.hello -> 'Hello from Ruby'

class MyClass2
include Mixin, :name => 'Tom'
end

m = MyClass2.new
m.hello -> 'Hello from Tom'

T.

I'd rather see this:

class Module
def include(mod, *args, &block)
mod.send :append_features, self
if mod.respond_to? :included
mod.included(self, *args, &block)
end
end
end

module Chewable
def self.included(klass, *args)
puts "Included in #{klass} with the following args:"
args.each { |arg| puts " * #{arg.inspect}" }
end
end

class Klass
include Chewable "foo", "bar", "baz"
end


Cheers,
Daniel
 
D

Daniel Schierbeck

Daniel said:
Trans said:
I would like to discuss the merits/non-merits and the best approach to
implementation of "dynamic modules" --modules that take parameters at
the time of include, thus altering their behavior per include. The
common denominator here is the altered interface of #include:

include AModule, :eek:pt1 => :val1, :eek:pt2 => :val2

Here's a simple example based on the implementation I (and friends) put
together

module Mixin

dynamic_feature do |options|

define_method :hello do
puts "Hello from #{options[:name]}"
end

end

end

class MyClass
include Mixin, :name => 'Ruby'
end

m = MyClass.new
m.hello -> 'Hello from Ruby'

class MyClass2
include Mixin, :name => 'Tom'
end

m = MyClass2.new
m.hello -> 'Hello from Tom'

T.

I'd rather see this:

class Module
def include(mod, *args, &block)
mod.send :append_features, self
if mod.respond_to? :included
mod.included(self, *args, &block)
end
end
end

module Chewable
def self.included(klass, *args)
puts "Included in #{klass} with the following args:"
args.each { |arg| puts " * #{arg.inspect}" }
end
end

class Klass
include Chewable "foo", "bar", "baz"
end


Cheers,
Daniel

That should of course be `include Chewable, "foo"...'
 
D

Daniel Schierbeck

Daniel said:
Daniel said:
Trans said:
I would like to discuss the merits/non-merits and the best approach to
implementation of "dynamic modules" --modules that take parameters at
the time of include, thus altering their behavior per include. The
common denominator here is the altered interface of #include:

include AModule, :eek:pt1 => :val1, :eek:pt2 => :val2

Here's a simple example based on the implementation I (and friends) put
together

module Mixin

dynamic_feature do |options|

define_method :hello do
puts "Hello from #{options[:name]}"
end

end

end

class MyClass
include Mixin, :name => 'Ruby'
end

m = MyClass.new
m.hello -> 'Hello from Ruby'

class MyClass2
include Mixin, :name => 'Tom'
end

m = MyClass2.new
m.hello -> 'Hello from Tom'

T.

I'd rather see this:

class Module
def include(mod, *args, &block)
mod.send :append_features, self
if mod.respond_to? :included
mod.included(self, *args, &block)
end
end
end

module Chewable
def self.included(klass, *args)
puts "Included in #{klass} with the following args:"
args.each { |arg| puts " * #{arg.inspect}" }
end
end

class Klass
include Chewable "foo", "bar", "baz"
end


Cheers,
Daniel

That should of course be `include Chewable, "foo"...'

Current implementation:

class Module
def include(mod, *args, &block)
mod.send :append_features, self
if mod.respond_to? :included
mod.included(self, *args, &block)
end
end
end

class Class
def is(*mods)
mods.each { |mod| include mod }
end
end


class Klass
is Chewable, Digestible
include MyModule, "foo", "bar", "baz"
end
 
T

Trans

Hi Peter,

A factory method is a fair idea, but there's a lot more to this:

MyMixin # but then modified ofcourse...

then that simple comment suggests. How do you handle *that*? That's
really the heart of the matter --making a factory or overriding
#include to pass options is the easy part.

Thanks,
T.
 
T

Trans

Also, can anyone confirm this? I heard someone say that
#append_features is being deprecated. True?

Thanks,
T.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,070
Latest member
BiogenixGummies

Latest Threads

Top