Il 28/06/07, Giuliano U. [email protected] ha scritto:
Ciao a todos…
allora, vi posto il codice sul quale ho versato il mio sudore nelle ultime
due ore prima di capire che forse ho bisogno di una mano
Premesso che non ho capito bene lo scopo e per quale motivo tu abbia
bisogno
di questa funzionalità, e che quindi potrei non aver interpretato
correttamente le specifiche, ho provato a scrivere una soluzione.
Per utilizzarla basta chiamare:
class Pippo
extend ExtendMethod
extend_method :pippo do |param|
puts param
end
end
Ovviamente potrebbe non funzionare, non l’ho testata adeguatamente, i
test
che ho fatto sono inclusi.
#! /usr/bin/ruby
module ExtendMethod
def blocks
@blocks ||= {}
end
def extend_method(name,new_name=nil,&block)
if new_name.nil?
alias_name = “ext_”+name.to_s
class_eval “alias :#{alias_name} :#{name}”
new_name = name.to_sym
name = alias_name.to_sym
end
blocks[new_name] = block
ext = <<-EXTENSION
def #{new_name}
#{name}(&self.class.blocks[:#{new_name}])
end
EXTENSION
class_eval(ext)
end
end
-----> Specs
require ‘rubygems’
require ‘spec’
describe “A Class extending ExtendMethod” do
before :each do
@class = Class.new
method =<<-METHOD
def method
yield “Hello”
end
METHOD
@class.send(:class_eval,method)
@class.send(:extend,ExtendMethod)
@instance = @class.new
end
it “should be able to extend method adding blocks” do
extension =<<-EXTENSION
extend_method(:method, :new_method) do |param|
param + " World"
end
EXTENSION
@class.send(:class_eval,extension)
@instance.should respond_to(:new_method)
@instance.new_method.should == "Hello World"
end
it “should be able to extend without renaming” do
extension =<<-EXTENSION
extend_method(:method) do |param|
param + " World"
end
EXTENSION
@class.send(:class_eval,extension)
@instance.method.should == "Hello World"
end
end