[#86984] Attempted roadmap of future instance variables.... — "David A. Black" <dblack@...>

Hi --

81 messages 2003/12/02
[#86998] Re: Attempted roadmap of future instance variables.... — Steve Tuckner <STUCKNER@...> 2003/12/02

So what is the relationship between @_ vars and @vars that are defined in a

[#87001] Re: Attempted roadmap of future instance variables.... — "David A. Black" <dblack@...> 2003/12/02

Hi --

[#87006] Re: Attempted roadmap of future instance variables.... — Steve Tuckner <STUCKNER@...> 2003/12/02

Maybe I am being dense, so bear with me...

[#87011] Re: Attempted roadmap of future instance variables.... — Lyle Johnson <lyle@...> 2003/12/02

Steve Tuckner wrote:

[#87013] Re: Attempted roadmap of future instance variables.... — Steve Tuckner <STUCKNER@...> 2003/12/02

OK so the jist of it is that @_var variables are stored with the class of

[#87095] Re: Attempted roadmap of future instance variables.... — "Robert Klemme" <bob.news@...> 2003/12/03

[#87098] Re: Attempted roadmap of future instance variables.... — "David A. Black" <dblack@...> 2003/12/03

Hi --

[#87102] Re: Attempted roadmap of future instance variables.... — ts <decoux@...> 2003/12/03

>>>>> "D" == David A Black <dblack@wobblini.net> writes:

[#87244] Re: Attempted roadmap of future instance variables.... — "Christoph" <chr_mail@...> 2003/12/05

ts wrote:

[#87275] Re: Attempted roadmap of future instance variables.... — ts <decoux@...> 2003/12/05

>>>>> "C" == Christoph <chr_mail@gmx.net> writes:

[#87286] Re: Attempted roadmap of future instance variables.... — "Christoph" <chr_mail@...> 2003/12/05

ts wrote:

[#87290] Re: Attempted roadmap of future instance variables.... — "David A. Black" <dblack@...> 2003/12/05

Hi --

[#87308] Re: Attempted roadmap of future instance variables.... — Austin Ziegler <austin@...> 2003/12/05

On Fri, 5 Dec 2003 22:56:41 +0900, David A. Black wrote:

[#87310] Re: Attempted roadmap of future instance variables.... — "Christoph" <chr_mail@...> 2003/12/05

Austin Ziegler wrote:

[#87320] Re: Attempted roadmap of future instance variables.... — Austin Ziegler <austin@...> 2003/12/05

On Sat, 6 Dec 2003 01:40:42 +0900, Christoph wrote:

[#87322] Re: Attempted roadmap of future instance variables.... — "T. Onoma" <transami@...> 2003/12/05

On Friday 05 December 2003 06:41 pm, Austin Ziegler wrote:

[#87314] Re: Attempted roadmap of future instance variables.... — "T. Onoma" <transami@...> 2003/12/05

On Friday 05 December 2003 05:40 pm, Christoph wrote:

[#87318] Re: Attempted roadmap of future instance variables.... — matz@... (Yukihiro Matsumoto) 2003/12/05

Hi,

[#87335] Re: Attempted roadmap of future instance variables.... — Nathaniel Talbott <nathaniel@...> 2003/12/05

On Dec 5, 2003, at 12:15, Yukihiro Matsumoto wrote:

[#87066] What's the best way to create methods dealing with an object of a certain class? — Leif K-Brooks <eurleif@...>

I want to add a method to be run on Strings. Currently, I'm just adding

14 messages 2003/12/03
[#87072] Re: What's the best way to create methods dealing with an object of a certain class? — Lyle Johnson <lyle@...> 2003/12/03

Leif K-Brooks wrote:

[#87083] Some Regexp — orlovdn@... (Dmitry N Orlov)

I want to get array from file like this:

20 messages 2003/12/03

[#87203] sorting — vanjac12@... (Van Jacques)

I'm not sure where to post about this problem, so

18 messages 2003/12/04

[#87233] Generalized break? — Hal Fulton <hal9000@...>

I hate to bring up possible language changes, since there is

14 messages 2003/12/04

[#87255] WeakRef and Object#hash — Samuel Tesla <samuel@...>

I'm trying to implement a weak key hash to use for generic objects.

37 messages 2003/12/05
[#87259] Dumb question to which I ought to know the answer by now — "Mark J. Reed" <markjreed@...> 2003/12/05

Is there an assignment version of Hash#values_at, so I can assign

[#87266] Re: Dumb question to which I ought to know the answer by now — Austin Ziegler <austin@...> 2003/12/05

On Fri, 5 Dec 2003 12:42:05 +0900, Mark J. Reed wrote:

[#87333] Re: Attempted roadmap of future instance variables.... — "Weirich, James" <James.Weirich@...>

From: David A. Black [mailto:dblack@wobblini.net]

18 messages 2003/12/05
[#87337] Re: Attempted roadmap of future instance variables.... — Chris Thomas <chris@...> 2003/12/05

[#87402] Re: Attempted roadmap of future instance variables.... — matz@... (Yukihiro Matsumoto) 2003/12/06

Hi,

[#87382] Idea: Linux PIM in Ruby — Hal Fulton <hal9000@...>

On my wishlist of top 20 things I'd like to do: A PIM for Linux.

30 messages 2003/12/06
[#87407] Re: Idea: Linux PIM in Ruby — Lyle Johnson <lyle@...> 2003/12/06

Hal Fulton wrote:

[#87409] rbbr-0.5.0 — Masao Mutoh <mutoh@...>

Hi,

18 messages 2003/12/06

[#87430] Ideas for replacing $0==__FILE__ — Hal Fulton <hal9000@...>

I've accepted now that my "generalized break" was a bad idea. In

26 messages 2003/12/06
[#87720] Re: Ideas for replacing $0==__FILE__ — Eric Hodel <drbrain@...7.net> 2003/12/10

Hal Fulton (hal9000@hypermetrics.com) wrote:

[#87723] Re: Ideas for replacing $0==__FILE__ — Hal Fulton <hal9000@...> 2003/12/10

Eric Hodel wrote:

[#87726] Re: Ideas for replacing $0==__FILE__ — Eric Hodel <drbrain@...7.net> 2003/12/10

Hal Fulton (hal9000@hypermetrics.com) wrote:

[#87459] Trying to create a Ruby daemon — Samuel Kvarnbrink <samuel.kvarnbrink@...>

Hi,

11 messages 2003/12/07

[#87553] format money — saggmannen@... (saggmannen)

Hello, is there a way to format "Money"-style floats in ruby. E.g:

25 messages 2003/12/08

[#87587] Adjusting the Scope of Blocks — Mark Cox <mark_cox@...>

Hi,

22 messages 2003/12/09
[#87606] Re: Adjusting the Scope of Blocks — "Robert Klemme" <bob.news@...> 2003/12/09

[#87620] Re: Adjusting the Scope of Blocks — "David A. Black" <dblack@...> 2003/12/09

Hi --

[#87626] ANN: REXML 2.7.2 — ser@... (Sean Russell)

Hi,

18 messages 2003/12/09

[#87638] Inheriting variables, super, and "not super"? — Hugh Sasse Staff Elec Eng <hgs@...>

Is there a way in a method to say

11 messages 2003/12/09

[#87706] Docs for Socket, OpenSSL, etc — "James F. Hranicky" <jfh@...>

Are there any plans to add docs for modules like Socket and OpenSSL, etc to

23 messages 2003/12/10
[#87766] Re: Docs for Socket, OpenSSL, etc — Simon Strandgaard <neoneye@...> 2003/12/11

On Wed, 10 Dec 2003 23:20:21 +0900, James F. Hranicky wrote:

[#87769] Re: Docs for Socket, OpenSSL, etc — "James F. Hranicky" <jfh@...> 2003/12/11

On Thu, 11 Dec 2003 20:57:00 +0900

[#87780] Re: Docs for Socket, OpenSSL, etc — Dave Thomas <dave@...> 2003/12/11

[#87781] Re: Docs for Socket, OpenSSL, etc — "James F. Hranicky" <jfh@...> 2003/12/11

On Fri, 12 Dec 2003 00:07:28 +0900

[#87775] prog for g.c.d. of 2 integers — vanjac12@... (Van Jacques)

Topics from mathematics make good practice programs, IMO.

13 messages 2003/12/11

[#87783] problems with racc: $end token — "Luke A. Kanies" <luke@...>

Hello,

14 messages 2003/12/11
[#87789] Re: problems with racc: $end token — Jim Freeze <jim@...> 2003/12/11

On Friday, 12 December 2003 at 0:42:30 +0900, Luke A. Kanies wrote:

[#87819] Ruby-Talk Subject Matters — "T. Onoma" <transami@...>

Out of curiosity, how do others feel about "suggestive" threads? Do you feel

15 messages 2003/12/11

[#87856] Simple issue giving problems — Brad <coish@...>

Hello all,

17 messages 2003/12/11

[#88031] inplace assignment — "T. Onoma" <transami@...>

is there anyway, anyway at all, ugly hacks accepted, of doing inplace

40 messages 2003/12/14
[#88032] Re: inplace assignment — Hal Fulton <hal9000@...> 2003/12/14

T. Onoma wrote:

[#88034] Re: inplace assignment — "T. Onoma" <transami@...> 2003/12/14

On Sunday 14 December 2003 05:51 am, Hal Fulton wrote:

[#88037] Re: inplace assignment — Hal Fulton <hal9000@...> 2003/12/14

T. Onoma wrote:

[#88041] Re: inplace assignment — "T. Onoma" <transami@...> 2003/12/14

On Sunday 14 December 2003 07:49 am, Hal Fulton wrote:

[#88056] Re: inplace assignment — "David A. Black" <dblack@...> 2003/12/14

On Sun, 14 Dec 2003, T. Onoma wrote:

[#88059] Re: inplace assignment — "T. Onoma" <transami@...> 2003/12/14

On Sunday 14 December 2003 03:59 pm, David A. Black wrote:

[#88064] Re: inplace assignment — "David A. Black" <dblack@...> 2003/12/14

On Mon, 15 Dec 2003, T. Onoma wrote:

[#88077] All there is to know about Duck Typing (was: inplace assignment) — "T. Onoma" <transami@...> 2003/12/14

Alright, a number of things related to Duck Tpying have been popping up and I

[#88081] Re: All there is to know about Duck Typing (was: inplace assignment) — "David Naseby" <david.naseby@...> 2003/12/14

> -----Original Message-----

[#88147] extremely strange segfault — "Luke A. Kanies" <luke@...>

Hi all,

14 messages 2003/12/15

[#88150] UnboundMethods Useless? — "T. Onoma" <transami@...>

Urrrr.....

34 messages 2003/12/15
[#88239] Re: UnboundMethods Useless? — Dan Doel <djd15@...> 2003/12/16

You can do stuff like this:

[#88309] Re: UnboundMethods Useless? — "T. Onoma" <transami@...> 2003/12/17

On Tuesday 16 December 2003 08:54 pm, Dan Doel wrote:

[#88322] Re: UnboundMethods Useless? — Chad Fowler <chad@...> 2003/12/17

On Wed, 17 Dec 2003, T. Onoma wrote:

[#88323] Re: UnboundMethods Useless? — ts <decoux@...> 2003/12/17

>>>>> "C" == Chad Fowler <chad@chadfowler.com> writes:

[#88327] Re: UnboundMethods Useless? — "T. Onoma" <transami@...> 2003/12/17

On Wednesday 17 December 2003 01:21 pm, ts wrote:

[#88328] Re: UnboundMethods Useless? — ts <decoux@...> 2003/12/17

>>>>> "T" == T Onoma <transami@runbox.com> writes:

[#88332] Re: UnboundMethods Useless? — "T. Onoma" <transami@...> 2003/12/17

On Wednesday 17 December 2003 01:59 pm, ts wrote:

[#88333] Re: UnboundMethods Useless? — "David A. Black" <dblack@...> 2003/12/17

On Wed, 17 Dec 2003, T. Onoma wrote:

[#88336] Re: UnboundMethods Useless? — Peter <Peter.Vanbroekhoven@...> 2003/12/17

> I don't know what you mean by (ir)reversible, but the point is that

[#88337] Re: UnboundMethods Useless? — ts <decoux@...> 2003/12/17

>>>>> "P" == Peter <Peter.Vanbroekhoven@cs.kuleuven.ac.be> writes:

[#88159] Re: Extracting multiple lines from a file — "Berger, Daniel" <djberge@...>

> -----Original Message-----

18 messages 2003/12/15
[#88161] Re: Extracting multiple lines from a file — "Ron Coutts" <rcoutts@...> 2003/12/15

[#88166] Re: Extracting multiple lines from a file — "Mark J. Reed" <markjreed@...> 2003/12/15

On Tue, Dec 16, 2003 at 07:16:23AM +0900, Ron Coutts wrote:

[#88199] Re: Extracting multiple lines from a file — Derek Lewis <lewisd@...00f.net> 2003/12/16

On Tue, 16 Dec 2003, Mark J. Reed wrote:

[#88172] Copying methods from one class to another — "T. Onoma" <transami@...>

Is there any way to copy a method from one class to another?

22 messages 2003/12/16
[#88174] Re: Copying methods from one class to another — Jamis Buck <jgb3@...> 2003/12/16

T. Onoma wrote:

[#88183] Re: Copying methods from one class to another — "T. Onoma" <transami@...> 2003/12/16

On Tuesday 16 December 2003 05:23 am, Jamis Buck wrote:

[#88189] Re: Copying methods from one class to another — "David A. Black" <dblack@...> 2003/12/16

On Tue, 16 Dec 2003, T. Onoma wrote:

[#88191] Re: Copying methods from one class to another — "T. Onoma" <transami@...> 2003/12/16

On Tuesday 16 December 2003 02:51 pm, David A. Black wrote:

[#88195] Re: Copying methods from one class to another — Hacksaw <hacksaw@...> 2003/12/16

Sorry to step into the middle of a conversation, but what does this mean:

[#88211] Newbie questions — jfrapper@... (Jim Frapper)

I was wondering what the equivalent tools were to perldoc(ri is not)

44 messages 2003/12/16
[#88259] Re: Newbie questions — Chad Fowler <chad@...> 2003/12/16

On Wed, 17 Dec 2003, Jim Frapper wrote:

[#88266] Re: Newbie questions — Gavin Sinclair <gsinclair@...> 2003/12/16

On Wednesday, December 17, 2003, 8:10:19 AM, Chad wrote:

[#88270] Re: Newbie questions — Daniel Carrera <dcarrera@...> 2003/12/16

>

[#88271] Re: Newbie questions — "Luke A. Kanies" <luke@...> 2003/12/16

On Wed, 17 Dec 2003, Daniel Carrera wrote:

[#88272] Re: Newbie questions — Daniel Carrera <dcarrera@...> 2003/12/16

On Wed, Dec 17, 2003 at 07:07:45AM +0900, Luke A. Kanies wrote:

[#88280] Re: Newbie questions — "Luke A. Kanies" <luke@...> 2003/12/16

On Wed, 17 Dec 2003, Daniel Carrera wrote:

[#88370] Re: Newbie questions — Derek Lewis <lewisd@...00f.net> 2003/12/17

[#88220] Re: Newbie questions — "Berger, Daniel" <djberge@...>

> -----Original Message-----

31 messages 2003/12/16
[#88224] Re: Newbie questions — Hal Fulton <hal9000@...> 2003/12/16

Berger, Daniel wrote:

[#88227] Re: Newbie questions — Thomas Adam <thomas_adam16@...> 2003/12/16

--- Hal Fulton <hal9000@hypermetrics.com> wrote:

[#88228] Re: Newbie questions — Hal Fulton <hal9000@...> 2003/12/16

Thomas Adam wrote:

[#88289] Very odd IO problem — Brad <coish@...>

All:

18 messages 2003/12/17

[#88414] Yukihiro - Please ensure backwards compatibility — jobeicus@... (Joseph Benik)

having recently migrated one of my machines from a 1.6 flavor to the

14 messages 2003/12/18

[#88494] How to return more than one result from a method? — Tim Hunter <cyclists@...>

I'm trying to code a method that has two result values. The values are

14 messages 2003/12/19

[#88581] replacing two EOL chars by one — xah@... (Xah Lee)

i have a bunch of java files that has spaced-out formatting that i

23 messages 2003/12/20

[#88643] Ruby 1.8.1 preview4 — matz@... (Yukihiro Matsumoto)

Hi,

32 messages 2003/12/22

[#88731] RubyGems and dependencies — sera@... (Francis Hwang)

Two RubyGems questions about dependencies:

16 messages 2003/12/23

[#88781] TkText freezes — quillion <me@...>

Hello all,

21 messages 2003/12/24

[#88814] ruby 1.8.1 — matz@... (Yukihiro Matsumoto)

Merry Christmas,

25 messages 2003/12/24

[#88936] Inconsistent value of uninitialized variable — Gavin Sinclair <gsinclair@...>

The following statement, free of all context, generates an error:

10 messages 2003/12/28

[#88954] An addition to Array (or Enumerable)? — Harry Ohlsen <harryo@...>

Yesterday, I wanted to get the output from "ls -l some_file" and pull out just the file size and the file name. As I start writing this, I realise, of course, that I'd have been better off just using the File#size method, but I still think the issue I hit is interesting.

12 messages 2003/12/28

[#89015] ruby-dev summary 22273-22434 — "Takaaki Tateishi" <ttate@...>

Hello,

16 messages 2003/12/30
[#89016] Re: ruby-dev summary 22273-22434 — Austin Ziegler <austin@...> 2003/12/30

On Wed, 31 Dec 2003 00:45:11 +0900, Takaaki Tateishi wrote:

Re: Underpinnings of Method Wrapping

From: "T. Onoma" <transami@...>
Date: 2003-12-10 06:08:59 UTC
List: ruby-talk #87688
On Wednesday 10 December 2003 05:16 am, Peter wrote:
> > QUICK SIDE NOTE: might be nice to have something for all those dang ends.
> > How about end_____end, with as many underscore (2 or more) as needed:
> >
> >   Compiler.aspect do |meth|
> >     if meth.tag==:chroot
> >       meth.wrap do
> > 	if doer.cflow_ancestors.any? {|a| a.tag==:chroot}
> >           super
> >         else
> >           chroot_evironment do
> >             super
> >   end_____end
>
> Actually counting consecutive underscores is hard. On my screen they make
> up one long line.

Mine too! But I was joking :) Well, half way. It would be nice to have a good 
way, I was just throwing an psuedo example out there.

> > cflow logic is certainly a different way of thinking, but I don't really
> > see how cflow logic would become so complex that you'd want to go back to
> > explicts. It's essentially the same logic, actually, just applied
> > differently. In fact I think one will find that the ease of managing such
> > aspects are on an order of magnitude greater than explictly doing so. I
> > don;t see cflow being the the essential part of AOP, but it is another
> > useful part of it.
>
> Agreed, cflow is not *the* essential part of AOP. But I think I should
> make my example more concrete to show the complexity of cflow logic
> (although maybe it may be a bit contrived, but I hope you get the point).
>
>   class Compiler
>     def compile:no_chroot
>       task1
>       task2
>     end
>     def task1:chroot
>       # do some stuff
>       task2
>       task3
>       # some other stuff
>     end
>     def task2:chroot
>     end
>     def task3:no_chroot
>       # do some stuff
>       task4
>       # do some other stuff
>     end
>     def task4:whatever
>       task5
>     end
>     def task5:chroot
>     end
>   end
>
> I used indicators to indicate whether a method needs chroot, or doesn't
> want it, or it doesn't matter (if the task it performs is so small that
> it is overhead to change the environment and then put it back).
>
> What your wrapper then needs to do is create a chroot env for methods with
> a 'chroot' indicator if it wasn't there yet, and destroy the chroot env
> for a method with the 'no_chroot' indicator, if the env was there. So
> basically, in terms of cflow, you need to create the chroot env when you
> are in the cflow of a method m1 with the chroot indicator, and when there
> is no other method m2 in the cflow of m1, unless there's another method m3
> in the cflow of m2 that has the chroot indicator, etc. OK, I'm
> exagerating, but you need to be able to say that there exists a method
> m1:chroot in whose cflow we are and for which no method m2:no_chroot
> exists in its cflow and in whose cflow we are too. You can't even say that
> in AspectJ BTW. But if I do it myself explicitly, I'd just add a variable
> to the Compile class that keeps track of whether we are in a chroot
> environment or not, and have my wraps use that information and change
> environment if needed and set that variable accordingly. Much easier, and
> much harder to break by extensions.

Actually I disagree. Only harder b/c one is not used to it. Once "mastered" an 
AOP programmer could have the same job done in the same or less time, and 
could certainly make adjustment's much faster. While you'd have to do through 
every method to adjust. Also, anything is breakable by extension very easily.

     def Compiler.compile:no_chroops
       ...
     end

broken.

> The alternative is to change the subdivision of the tasks so that we can
> group chrooted tasked, but since chrooting is another concern, we don't
> want that governing the way we subdivide the tasks.
>
> > Well, sort-of, in 86785 I was showing how we might mixin singletons in a
> > class definable way, which is the essence of wrapping. Its not that they
> > are outer or inner per se; I wasn't thinking about that at the time, and
> > is something additional to take into consideration (currently they would
> > indeed be outer though). We can already define mixin singletons in an
> > object definable way using #extend. You may have read about that in a
> > couple of my recent posts on the matter (87408 is good starting point in
> > the thread).
>
> I agree that there are already features present in the Ruby language that
> allow us to do wrapping-like things. But if I understand well that's
> mostly based on subclassing (defining singletons comes down to defining
> singleton classes implicitly).

But it dosen't need to be. These aren't just "wrapping-like things". It *is* 
wrapping. And with only some basic modifications, i.e. meta-singletons and 
class defineable singletons, can be the very foundation of AOP for Ruby.

> As for my mention of friend classes and namespaces... Currently in Ruby
> there is class-based access control for methods and variables. For the
> former it can be changed (public/private/protected), for the latter it is
> fixed (until @var and @_var come along that give some control). But since
> aspects are cutting across classes, we'd naturally need something more
> than class-based access control. Actually a simple example of a
> cross-cutting concern is a bidirectional link between two objects. Keeping
> those links consistent is one concern, but if the objects involved are of
> different class, this concern involves multiple classes. An aspect could
> keep track of the links and make sure they are always consistent. In
> AspectJ you could sneak in some variables to keep the links in the
> respective classes, but they are private to the aspect and can't be
> accessed from those classes. That's logical because then any operations
> involving the link are performed by methods that the aspect offers and
> consistency is guaranteed. Of course the notion of friend classes is too
> limited in this case, but it allows to change access control. Namespaces
> do that too in a sense.

Hmm, I think I may understand what your refering to now. I don't think of it 
that way. For me all varaibles are of the same scope as they are now 
--aspects don't have some special cross-cutting scope. For that you'd use a 
class/module variable as we do now. Certainly one could invision such a 
cross-cutting scope, but such a scope is not neccessary; and whether it 
should be able to interact with the regular scope is again the difference 
between passive and active wraps...

> But to get back to my previous mail; I think the point I was trying to
> convey is as follows. When we look at outer wraps, we see that they are
> really just hooks. You can hook em, unhook em, and nobody will ever notice
> a thing except you yourself. That's clean separation of concerns, and
> that's what AspectJ does best. Examples are security, profiling, tracing,
> logging, GUI observers, pre/postcondition checking, keeping dirty bits
> when objects on screen are moved, error logging, invariant checking...
> They are best done by using hooks (or outer wraps).
>
> But then inner wraps. As you've pointed out, a primary method and its
> wraps are really one whole. If a wrap is removed, then the method will
> change functionality. Adding an inner wrap or removing one is much more
> noticeable. Actually they kind of behave like a method and the helper
> methods (or what I called subroutines by lack of a better term) it calls,
> or like a method calling the same method in a super class. They add layers
> of extra functionality. To me it feels like that is what class hierarchies
> were invented for, or the hierarchy in a method call graph.
>
> Maybe what I need is a simple example of inner wraps (that I could in no
> way classify as an outer wrap, because I think our notions of that are
> slightly different) and that clearly demonstrates its importance in
> separating concerns in the sense that it does it better than current Ruby.
> Then we could discuss something more concrete. Or maybe I should wait
> until your RCR has been updated. I know I am overly sceptical now, but
> maybe that's because some things are getting clearer, and other things
> getting fuzzier.

Active wraps need not alter functionality. Certainly they can, and even here 
they have their advantages: easily removed and so serve as testing code 
variations, they can be reused like mixins in appropriate contexts, etc. But 
more significantly they can also be used to interact in a way consistant with 
a class, injecting and extracting information without "augmenting" behavior. 
I think this is the option you are not witnessing.

Your response has got me digging up my old GUI code. Its been a while, and I'd 
be hard pressed to tell you how everything works off the top of my head, but 
I thought you might like to look at some of its heart. What better example 
than a real one. If only I had a real AOP way to do, rather then the mind 
boggling terseness of what follows. Have fun ;)

module Controller

  module Listener

    def ___listen___(meth=nil, *args, &block)
      meth = meth.to_s
      if @___events___
        if @___events___.has_key?(meth)
          @___events___[meth].each { |p|
            p.call(*args, &block)
          }
        end
      end
      if @___procs___ and @___state___
        if self != @___state___
          @___state___ = self.clone
          @___procs___.each { |p|
            p.call(self)
          }
        end
      end
    end

    def ___automate___
      $___trigger___ = [] unless $___trigger___
      self.methods.each { |meth|
        if not Object.instance_methods(true).include?(meth)
          if not ['when', 'event', 'bind', 'change', '___listen___', 
'___automate___', '___action___'].include?(meth)
            ___action___(meth)
          end
        end
      }
    end

    def ___action___(meth)
      ali = "___#{meth.hash.to_s.gsub('-', '_')}___"
      if not self.respond_to? ali
        self.instance_eval <<-EOS
          class << self
            alias_method :#{ali}, :#{meth}
            def #{meth}(*args, &block)
              return if $___trigger___.include?([self, :#{meth}])
              $___trigger___ << [self, :#{meth}]
              r = send(:#{ali}, *args, &block)
              ___listen___(:#{meth}, *args, &block)
              $___trigger___.pop
              return r
            end
          end
        EOS
      end
    end

  end

  
  module Methods
  
    include Listener
  
    def when(meth, prc=nil, &block)
      meth = meth.to_s
      ___automate___ unless @___events___
      @___events___ = {} unless @___events___
      prc = block unless prc
      @___events___[meth] = [] unless @___events___[meth]
      @___events___[meth] << prc
    end

  end

  
  module Variables

     include Listener
 
    def bind(prc=nil, &block)
      ___automate___ unless @___procs___ and @___state___
      @___state___ = self.clone unless @___state___
      @___procs___ = [] unless @___procs___
      prc = block unless prc
      @___procs___ << prc
    end    

  end

end

class Object
  include Controller::Methods
end

class Numeric
  include Controller::Variables
end

class String
  include Controller::Variables
end

class Array
  include Controller::Variables
end

class Hash
  include Controller::Variables
end


In This Thread