[#11822] RCR: Input XML support in the base Ruby — Dave Thomas <Dave@...>

15 messages 2001/03/01

[#11960] Not Ruby, for me, for the moment at least — "Michael Kreuzer" <mkreuzer@... (nospam)>

I wrote on this newsgroup last weekend about how I was considering using

11 messages 2001/03/04

[#12023] French RUG ? — "Jerome" <jeromg@...>

Hi fellow rubyers,

16 messages 2001/03/05

[#12103] disassembling and reassembling a hash — raja@... (Raja S.)

Given a hash, h1, will the following always hold?

20 messages 2001/03/06

[#12204] FEATURE REQUEST: 'my' local variables — Leo Razoumov <see_signature@127.0.0.1>

Ruby is, indeed, a very well designed language.

64 messages 2001/03/07
[#12250] Re: FEATURE REQUEST: 'my' local variables — Leo Razoumov <see_signature@127.0.0.1> 2001/03/07

>>>>> "GK" == GOTO Kentaro <gotoken@math.sci.hokudai.ac.jp> writes:

[#12284] Re: FEATURE REQUEST: 'my' local variables — gotoken@... (GOTO Kentaro) 2001/03/08

In message "[ruby-talk:12250] Re: FEATURE REQUEST: 'my' local variables"

[#12289] Re: FEATURE REQUEST: 'my' local variables — matz@... (Yukihiro Matsumoto) 2001/03/08

Hi,

[#12452] Re: FEATURE REQUEST: 'my' local variables — gotoken@... (GOTO Kentaro) 2001/03/12

In message "[ruby-talk:12289] Re: FEATURE REQUEST: 'my' local variables"

[#12553] Re: FEATURE REQUEST: 'my' local variables — Dave Thomas <Dave@...> 2001/03/13

matz@zetabits.com (Yukihiro Matsumoto) writes:

[#12329] Math package — Mathieu Bouchard <matju@...>

18 messages 2001/03/09

[#12330] Haskell goodies, RCR and challenge — Robert Feldt <feldt@...>

Hi,

19 messages 2001/03/09
[#12374] Re: Haskell goodies, RCR and challenge — matz@... (Yukihiro Matsumoto) 2001/03/10

Hi,

[#12349] Can Ruby-GTK display Gif Png or Jpeg files? — Phlip <phlip_cpp@...>

Ruby-san:

20 messages 2001/03/09

[#12444] class variables — Max Ischenko <max@...>

14 messages 2001/03/12

[#12606] Order, chaos, and change requests :) — Dave Thomas <Dave@...>

17 messages 2001/03/14

[#12635] email address regexp — "David Fung" <dfung@...>

i would like to locate probable email addresses in a bunch of text files,

12 messages 2001/03/14

[#12646] police warns you -- Perl is dangerous!! — Leo Razoumov <see_signature@127.0.0.1>

I just read this story on Slashdot

14 messages 2001/03/14
[#12651] Re: police warns you -- Perl is dangerous!! — pete@... (Pete Kernan) 2001/03/14

On 14 Mar 2001 11:46:35 -0800, Leo Razoumov <see_signature@127.0.0.1> wrote:

[#12691] Re: police warns you -- Perl is dangerous!! — "W. Kent Starr" <elderburn@...> 2001/03/15

On Wednesday 14 March 2001 15:40, Pete Kernan wrote:

[#12709] [OFFTOPIC] Re: police warns you -- Perl is dangerous!! — Stephen White <spwhite@...> 2001/03/16

On Fri, 16 Mar 2001, W. Kent Starr wrote:

[#12655] Re: FEATURE REQUEST: 'my' local variables — "Benjamin J. Tilly" <ben_tilly@...>

>===== Original Message From Leo Razoumov <see_signature@127.0.0.1> =====

18 messages 2001/03/14

[#12706] Library packaging — "Nathaniel Talbott" <ntalbott@...>

I have a project that I'm working on that needs to live two different lives,

30 messages 2001/03/16

[#12840] Looking for a decent compression scheme — Dave Thomas <Dave@...>

14 messages 2001/03/19

[#12895] differences between range and array — "Doug Edmunds" <dae_alt3@...>

This code comes from the online code examples for

16 messages 2001/03/20
[#12896] Re: differences between range and array — "Hee-Sob Park" <phasis@...> 2001/03/20

[#12899] Re: differences between range and array — Jim Freeze <jim@...> 2001/03/20

On Tue, 20 Mar 2001, Hee-Sob Park wrote:

[#12960] TextBox ListBox — Ron Jeffries <ronjeffries@...>

Attached is a little Spike that Chet and I are doing. It is a

13 messages 2001/03/20

[#12991] [ANN] Lapidary 0.2.0 — "Nathaniel Talbott" <ntalbott@...>

Well, here's my first major contribution to the Ruby world: Lapidary. It's a

16 messages 2001/03/20

[#13028] mkmf question — Luigi Ballabio <luigi.ballabio@...>

15 messages 2001/03/21

[#13185] Reading a file backwards — "Daniel Berger" <djberg96@...>

Hi all,

21 messages 2001/03/25
[#13197] Re: Reading a file backwards — "Daniel Berger" <djberg96@...> 2001/03/25

> Hi Dan,

[#13203] Re: Reading a file backwards — Mathieu Bouchard <matju@...> 2001/03/25

On Sun, 25 Mar 2001, Daniel Berger wrote:

[#13210] Re: Reading a file backwards — "Daniel Berger" <djberg96@...> 2001/03/25

"Mathieu Bouchard" <matju@sympatico.ca> wrote in message

[#13374] Passing an array to `exec'? — Lloyd Zusman <ljz@...>

I'd like to do the following:

15 messages 2001/03/31

[#13397] Multidimensional arrays and hashes? — Lloyd Zusman <ljz@...>

Is it possible in ruby to make use of constructs that correspond to

14 messages 2001/03/31

[ruby-talk:12732] ModuleModifier.rb - An interesting idea...

From: "Freeman Pascal" <pascal@...>
Date: 2001-03-16 08:27:49 UTC
List: ruby-talk #12732
Hello,

While exploring Ruby and looking for answers to my recent questions
(see [ruby-talk:12557]).  I came up with an interesting use of
append_features().

I'm looking at using Ruby in a virtual environs project and wanted
a language that was expressive and simple as Smalltalk but was
embeddable and could eventually support native compilation or 
running in an embeddable VM.  Ruby looks like it has that potential
and even has projects working in these directions.

As a bonus Ruby is very expressive at the meta level and allows
extending the language into interesting directions.  One of the
features I wanted with my virtual environs efforts was the ability
for the language implementing environment and entity behavior to
refer to feature sets though a common naming scheme and allow
extending system and user classes by referring to a common feature
name while hiding class specific specializations.

Here is what I came up with using Ruby.  It is a module that allows
packaging extensions to a class or set of classes into a single
module that can be referred to by a single name, and dynamically
extends any classes as necessary to implement the desired behavior
across the calling classes.  I hate the name, ModuleModifier, if
anyone can think of a better OO domain specific nomenclature I
would happily change it.  The comments below contain a functional
example.

Being new to Ruby and OO in general, I would be interested in any
comments.  Please forgive me if my explanation seems thin, I'm 
still learning the vocabulary necessary to communicate OO design
and methodologies.

-Freeman

# ModuleModifier.rb

# ModuleModifier is used to enable modules to package modifications
# to including classes or modules under a common name

# Example:
#
# require "ModuleModifier"
#
# module Foo
#
#   include ModuleModifier
#
#   def whoami
#     puts "#{self.class} = #{self}"
#   end
#
#   module Bar
#     def hello
#       puts "Hello, World!"
#     end
#   end
#
#   module Baz
#     def goodbye
#       puts "Goodbye cruel world!"
#     end
#   end
#
# end
#
# class Bar
#   include Foo
# end
#
# class Baz
#   include Foo
# end
#
# p Bar.ancestors		# -> [Bar, Foo, Foo::Bar, Object, Kernel]
# p Baz.ancestors		# -> [Baz, Foo, Foo::Baz, Object, Kernel]
#
# bar = Bar.new
# baz = Baz.new
#
# bar.whoami			# -> Bar = #<Bar:0x40197e98>
# baz.whoami			# -> Baz = #<Baz:0x401949a0>
#
# bar.hello			# -> Hello, World!
# baz.goodbye			# -> Goodbye cruel world!
#

module ModuleModifier
  
  # Override append_features to add a custom append_features()
  # to the class including ModuleModifier.

  def ModuleModifier.append_features (klass)
    klass.module_eval %Q{

      def #{klass}.append_features (klass)
	klass.ancestors.each { |ancestor|
	  if eval "defined? \#{self}::\#{ancestor}"
	    klass.module_eval "include \#{self}::\#{ancestor}"
	    break
	  end
	}
	super
      end

    }
    # Neglicting to call super here keeps ModuleModifier from being
    # added as an ancestor to the class we are modifying.
  end

end



Attachments (1)

ModuleModifier.rb (1.42 KB, text/x-ruby)
# $Header$

# ModuleModifier.rb

# ModuleModifier is used to enable modules to package modifications
# to including classes or modules under a common name

# Example:
#
# require "ModuleModifier"
#
# module Foo
#
#   include ModuleModifier
#
#   def whoami
#     puts "#{self.class} = #{self}"
#   end
#
#   module Bar
#     def hello
#       puts "Hello, World!"
#     end
#   end
#
#   module Baz
#     def goodbye
#       puts "Goodbye cruel world!"
#     end
#   end
#
# end
#
# class Bar
#   include Foo
# end
#
# class Baz
#   include Foo
# end
#
# p Bar.ancestors		# -> [Bar, Foo, Foo::Bar, Object, Kernel]
# p Baz.ancestors		# -> [Baz, Foo, Foo::Baz, Object, Kernel]
#
# bar = Bar.new
# baz = Baz.new
#
# bar.whoami			# -> Bar = #<Bar:0x40197e98>
# baz.whoami			# -> Baz = #<Baz:0x401949a0>
#
# bar.hello			# -> Hello, World!
# baz.goodbye			# -> Goodbye cruel world!
#

module ModuleModifier
  
  # Override append_features to add a custom append_features()
  # to the class including ModuleModifier.

  def ModuleModifier.append_features (klass)
    klass.module_eval %Q{

      def #{klass}.append_features (klass)
	klass.ancestors.each { |ancestor|
	  if eval "defined? \#{self}::\#{ancestor}"
	    klass.module_eval "include \#{self}::\#{ancestor}"
	    break
	  end
	}
	super
      end

    }
    # Neglicting to call super here keeps ModuleModifier from being
    # added as an ancestor to the class we are modifying.
  end

end

# $Header$

In This Thread

Prev Next