best praxis to wrap methods?

  • Thread starter Meinrad Recheis
  • Start date
M

Meinrad Recheis

------=_Part_1901_6993034.1141724373102
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

hello fellow rubyists,

is there an elegant way to define a singleton method from a given symbol
without using eval? what i am doing is this:

def make_wrapper object, method
eval %{
def object.#{method}
# do something here
super # call the wrapped method
end
}
end

# example of usage:
make_wrapper STDOUT, :puts

using eval works, but it seems not to be the best solution. is there
annother way do define methods from a given symbol?

-- henon

------=_Part_1901_6993034.1141724373102--
 
M

Meinrad Recheis

------=_Part_1929_31062276.1141724577777
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

hello fellow rubyists,

is there an elegant way to define a singleton method from a given symbol
without using eval? what i am doing is this:

def make_wrapper object, method
eval %{
def object.#{method}
# do something here
super # call the wrapped method
end
}
end


sorry the above code does not work, (needs to be done using
object.instance_eval) but you get the idea what i mean

# example of usage:
make_wrapper STDOUT, :puts

using eval works, but it seems not to be the best solution. is there
annother way do define methods from a given symbol?

-- henon

------=_Part_1929_31062276.1141724577777--
 
R

Robert Klemme

Meinrad said:
hello fellow rubyists,

is there an elegant way to define a singleton method from a given
symbol without using eval? what i am doing is this:

def make_wrapper object, method
eval %{
def object.#{method}
# do something here
super # call the wrapped method
end
}
end

# example of usage:
make_wrapper STDOUT, :puts

using eval works, but it seems not to be the best solution. is there
annother way do define methods from a given symbol?

Are you sure the code you presented actually works? IMHO your code will
fail if the method is defined in the same class (i.e. no "super"
possible).

You could use Delegator for this. And, if the method you want to wrap
does not use a block define_method usually works quite well.

Kind regards

robert
 
M

Meinrad Recheis

------=_Part_2093_987305.1141725759967
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Meinrad Recheis wrote:
[snipped]

Are you sure the code you presented actually works? IMHO your code will
fail if the method is defined in the same class (i.e. no "super"
possible).


afaik calling super in a singleton method calls the overridden method of
that object (of course i assert that the method to be wrapped exists).
here is the working code snippet:
def make_wrapper object, method
object.instance_eval %{
def self.#{method}(*args, &block)
puts "wrapped method #{method}"
super
end
}
end

You could use Delegator for this. And, if the method you want to wrap
does not use a block define_method usually works quite well.


ah, object.send( :define_method) is what i was looking for. thanks

Kind regards

------=_Part_2093_987305.1141725759967--
 

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

Forum statistics

Threads
473,995
Messages
2,570,235
Members
46,821
Latest member
AleidaSchi

Latest Threads

Top