On Friday 07 March 2003 11:34, Luke Palmer wrote:
> >   Hi guys, i was just wondering if some notification mechanism (
> > signal/slot alike ) was planned in perl 6, like they already are in
> > glib and qt ?
>
>   class Signal {
>     has @.dest;
>
>     method emit($code)  { $code($_) for @.dest }
>     method attach($obj) { push @.dest: $obj }
>   }
>
>   class Foo {
>     has Signal $.valueChanged is public;
>     has $.value is public;
>
>     method value($newval) {    # Overriding default accessor
>       $.value = $newval;
>       emit $.valueChanged: { .($newval) };
>       $.value
>     }
>   }
>
>   my Foo $a, $b;
>   $a.valueChanged.attach($b, { $b.value($_) });
>
>
> Or something like that.  Already supported :)
>
> It's neat how powerful the closure is.  I can't wait until I
> understand continuations!
>

  I was rather thinking about something lesser code intrusive :

class Senator {
  has $.money is public;
  has %.classifiedData is public;

  method travel($country, $date) {
    # do something suspect
  }
}

class LicensedToKill {
  has @.work is public;

  method watchAccount($who) {
    # may be normal though
  }
  method lookAtClassifiedData($vip,@dataKeys) {
    # i'm a thief, remember ?
  }
  method makeContactIn($vip,$country) {
    # try to make a new ally
  }
}

my Senator             $guessWho;
my LicensedToKill  $jamesBond;
my @jamesBondWork = ();

# called every time $guessWho.money is changed
@jamesBond.work[0] =
  spy(
    $guessWho.money,
    { $jamesBond.watchAccount($guessWho) }
    );

# called every time $guessWho.ClassifiedData is modified,
# means some key(s) are created, deleted or data has changed
# @_ should contain all concerned keys
@jamesBond.work[1] =
  spy(
    $guessWho.classifiedData,
    { $jamesBond.lookAtClassifiedData($guessWho,@_) }
    );

# called every time something is calling $guessWho.travel(...)
# @_ contains travel(...) call arguments
@jamesBond.work[2] =
  spy(
    $guessWho.travel,
    # i'll be waiting for him, do not need $date, just $country
    { $jamesBond.makeContactIn($guessWho,@_[0]}
    );

# at some point, $guessWho joins the dark side,
# we do not need to monitor his classified data any more
splice @jamesBond.work,1,1;


  This way spied class does not need to do anything special (appart from 
providing public elements :) ), thus any class is signal-handling ready :p


Safety concerns :
  - what happen when $jamesBond or $guessWho is deleted ??
    -> all associated handlers are removed
        (it may not be that easy to implement)
    -> *and* spy()'s magical return value just becomes undef.
  - if spy()'s magical return value is deleted or overwritten, then
    its associated handler is removed.

Improvements :
  - How could $jamesBond be notified when $guessWho is deleted ?
    -> Still do not know ... :(

> >   And no, i'm not planning on doing it myself :-/
>
> Planning on changing your plans now?
>
> Luke

  It sure is prematurate for me now :(, but i would enjoy (using) perl later 
:)

  Hope it helps :)
  Regards.

-- 
If you explain so clearly that nobody can misunderstand, somebody will.

Reply via email to