How to enhance RB

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
12 messages Options
Reply | Threaded
Open this post in threaded view
|

How to enhance RB

Andres Fortier-2
Hi list,
         I was wondering if there is a step-by-step guide on how to make
basic extensions to the RB. Right now I need to add a new tab at the
bottom pane to add a new tool (like the Rewrite tab), but ideally I'm
looking for something broader (like addin refactorings, new panes,
etc.). Any hints would be appreciated.

Thanks in advance,
                 Andrés

Reply | Threaded
Open this post in threaded view
|

Re: How to enhance RB

Mark Roberts
At 04:35 AM 8/9/2007, Andres Fortier wrote:
>Hi list,
>         I was wondering if there is a step-by-step guide on how to
> make basic extensions to the RB.

There is nothing in our basic documentation set about this. Somebody
else may have written something, but I don't know of it.

I tried to add a code tool a few years ago and found the API to be
very poorly expressed. After some frustration, I talked with one of
the original designers and tried to improve the method comments for
the API. Those should be in the base image now.

More recently, I know that Travis has further changed the API in an
effort to improve it. I don't know if he did any work to document
those changes in the code or otherwise improve the documentation.

Cheers,

M


Reply | Threaded
Open this post in threaded view
|

Re: How to enhance RB

Travis Griggs-3
On Aug 8, 2007, at 17:18, Mark Roberts wrote:

At 04:35 AM 8/9/2007, Andres Fortier wrote:
Hi list,
        I was wondering if there is a step-by-step guide on how to make basic extensions to the RB.

There is nothing in our basic documentation set about this. Somebody else may have written something, but I don't know of it.

I tried to add a code tool a few years ago and found the API to be very poorly expressed. After some frustration, I talked with one of the original designers and tried to improve the method comments for the API. Those should be in the base image now.

More recently, I know that Travis has further changed the API in an effort to improve it. I don't know if he did any work to document those changes in the code or otherwise improve the documentation.

Hehe. Guess I'm required to weigh in now. I have been changing this. The browser is currently in an "open development" form. I'm working to try and polish some of the loose ends in it, so we can swap it over to the production system. It's quite usable right now though. I use it every day, all day, and I know a couple of others do as well. I'd love it if other people would use it some more. We call it the 4xx series, because the version numbers were started at 404. To load it, close all of your existing browsers, and then load the latest 4xx version of Tools-RefactoringBrowser bundle from the Open Repository. 2 of the weeks are allocated doing other things (vacation and ESUG), so I don't expect to get this swapped over until the september builds realistically.

If you do decide to add a new tool to said browser... I'd look at:

1) CodeModel class comment
2) methods found in CodeModel class>>tab parts
3) Clone one of the CodeToolSelectionPolicy subclasses
4) Clone one of the CodeTool subclasses

The status bar is pluggable in the browser as well. I used that to plug in the SUnitToo(ls) controls. Look at CodeModel class comment for that as well. The API's much more free form there (make a VisualPart that understands codeModel: and touch and register it with a method like those found in 'status parts').

The top part... is still a bit tougher. It's on my agenda to work on that, because I'd like to integrate something like Anthony Lander's Hierarchy thing, and make the method iconFor: API more pluggable, and maybe some of the Dynamic Protocols and...

--
Travis Griggs
Objologist
"Dying men never wish they'd spent more time at the office"


Reply | Threaded
Open this post in threaded view
|

Re: How to enhance RB

Travis Griggs-3

On Aug 8, 2007, at 21:01, Travis Griggs wrote:



<snip> 2 of the weeks are allocated doing other things (vacation and ESUG), so I don't expect to get this swapped over until the september builds realistically.

Er, should read "2 of the weeks in August..."

<snip>
3) Clone one of the CodeToolSelectionPolicy subclasses
4) Clone one of the CodeTool subclasses

The "ClassCloning" package makes this kind of thing very easy. :)

--
Travis Griggs
Objologist
"I think that we should be men first, and subjects afterward." - Henry David Thoreau



Reply | Threaded
Open this post in threaded view
|

RE: How to enhance RB

Björn Eiderbäck-3
In reply to this post by Travis Griggs-3

To get the browser working I had to add a method

Object>>invalidateRectangle: xx

                "Just a fix to get the new browser working"

 

Since  in

Refactory.Browser.RefactoringBrowser>>invalidateTabs

                self rbTabs selectionIndex: (tools indexOf: currentBuffer value).

                (self builder componentAt: #rbTabs)

                                invalidateRectangle: (Rectangle origin: 0 @ 0

                                                                corner: self builder window width @ 28)

 

 

the message

   (self builder componentAt: #rbTabs)

resulted in an UndefinedObject.

 

Maybe there is  a better fix…

But coding via the inspector  (Object inspect) and rapidly writing this solved the problem.

 

/Björn

 

From: Travis Griggs [mailto:[hidden email]]
Sent: den 9 augusti 2007 06:02
To: VWNC List
Subject: Re: How to enhance RB

 

On Aug 8, 2007, at 17:18, Mark Roberts wrote:



At 04:35 AM 8/9/2007, Andres Fortier wrote:

Hi list,

        I was wondering if there is a step-by-step guide on how to make basic extensions to the RB.

 

There is nothing in our basic documentation set about this. Somebody else may have written something, but I don't know of it.

 

I tried to add a code tool a few years ago and found the API to be very poorly expressed. After some frustration, I talked with one of the original designers and tried to improve the method comments for the API. Those should be in the base image now.

 

More recently, I know that Travis has further changed the API in an effort to improve it. I don't know if he did any work to document those changes in the code or otherwise improve the documentation.

 

Hehe. Guess I'm required to weigh in now. I have been changing this. The browser is currently in an "open development" form. I'm working to try and polish some of the loose ends in it, so we can swap it over to the production system. It's quite usable right now though. I use it every day, all day, and I know a couple of others do as well. I'd love it if other people would use it some more. We call it the 4xx series, because the version numbers were started at 404. To load it, close all of your existing browsers, and then load the latest 4xx version of Tools-RefactoringBrowser bundle from the Open Repository. 2 of the weeks are allocated doing other things (vacation and ESUG), so I don't expect to get this swapped over until the september builds realistically.

 

If you do decide to add a new tool to said browser... I'd look at:

 

1) CodeModel class comment

2) methods found in CodeModel class>>tab parts

3) Clone one of the CodeToolSelectionPolicy subclasses

4) Clone one of the CodeTool subclasses

 

The status bar is pluggable in the browser as well. I used that to plug in the SUnitToo(ls) controls. Look at CodeModel class comment for that as well. The API's much more free form there (make a VisualPart that understands codeModel: and touch and register it with a method like those found in 'status parts').

 

The top part... is still a bit tougher. It's on my agenda to work on that, because I'd like to integrate something like Anthony Lander's Hierarchy thing, and make the method iconFor: API more pluggable, and maybe some of the Dynamic Protocols and...

 

--

Travis Griggs

Objologist

"Dying men never wish they'd spent more time at the office"



 

Reply | Threaded
Open this post in threaded view
|

Re: How to enhance RB

Andres Fortier-2
In reply to this post by Travis Griggs-3
Mark, Travis, Björn:
                     thank you very much for your helpful responses!! I
will try the things you suggested me and see how far I can get.

Thanks again!

Andrés

Travis Griggs escribió:

> On Aug 8, 2007, at 17:18, Mark Roberts wrote:
>
>> At 04:35 AM 8/9/2007, Andres Fortier wrote:
>>> Hi list,
>>>         I was wondering if there is a step-by-step guide on how to
>>> make basic extensions to the RB.
>>
>> There is nothing in our basic documentation set about this. Somebody
>> else may have written something, but I don't know of it.
>>
>> I tried to add a code tool a few years ago and found the API to be
>> very poorly expressed. After some frustration, I talked with one of
>> the original designers and tried to improve the method comments for
>> the API. Those should be in the base image now.
>>
>> More recently, I know that Travis has further changed the API in an
>> effort to improve it. I don't know if he did any work to document
>> those changes in the code or otherwise improve the documentation.
>
> Hehe. Guess I'm required to weigh in now. I have been changing this. The
> browser is currently in an "open development" form. I'm working to try
> and polish some of the loose ends in it, so we can swap it over to the
> production system. It's quite usable right now though. I use it every
> day, all day, and I know a couple of others do as well. I'd love it if
> other people would use it some more. We call it the 4xx series, because
> the version numbers were started at 404. To load it, close all of your
> existing browsers, and then load the latest 4xx version of
> Tools-RefactoringBrowser bundle from the Open Repository. 2 of the weeks
> are allocated doing other things (vacation and ESUG), so I don't expect
> to get this swapped over until the september builds realistically.
>
> If you do decide to add a new tool to said browser... I'd look at:
>
> 1) CodeModel class comment
> 2) methods found in CodeModel class>>tab parts
> 3) Clone one of the CodeToolSelectionPolicy subclasses
> 4) Clone one of the CodeTool subclasses
>
> The status bar is pluggable in the browser as well. I used that to plug
> in the SUnitToo(ls) controls. Look at CodeModel class comment for that
> as well. The API's much more free form there (make a VisualPart that
> understands codeModel: and touch and register it with a method like
> those found in 'status parts').
>
> The top part... is still a bit tougher. It's on my agenda to work on
> that, because I'd like to integrate something like Anthony Lander's
> Hierarchy thing, and make the method iconFor: API more pluggable, and
> maybe some of the Dynamic Protocols and...
>
> --
> Travis Griggs
> Objologist
> "Dying men never wish they'd spent more time at the office"
>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: How to enhance RB

Andres Fortier-2
In reply to this post by Travis Griggs-3
Travis,
        just one more thing: is 4xx compatible with 7.4.1 or only with 7.5?

Thanks,
        Andrés

Travis Griggs escribió:

> On Aug 8, 2007, at 17:18, Mark Roberts wrote:
>
>> At 04:35 AM 8/9/2007, Andres Fortier wrote:
>>> Hi list,
>>>         I was wondering if there is a step-by-step guide on how to
>>> make basic extensions to the RB.
>>
>> There is nothing in our basic documentation set about this. Somebody
>> else may have written something, but I don't know of it.
>>
>> I tried to add a code tool a few years ago and found the API to be
>> very poorly expressed. After some frustration, I talked with one of
>> the original designers and tried to improve the method comments for
>> the API. Those should be in the base image now.
>>
>> More recently, I know that Travis has further changed the API in an
>> effort to improve it. I don't know if he did any work to document
>> those changes in the code or otherwise improve the documentation.
>
> Hehe. Guess I'm required to weigh in now. I have been changing this. The
> browser is currently in an "open development" form. I'm working to try
> and polish some of the loose ends in it, so we can swap it over to the
> production system. It's quite usable right now though. I use it every
> day, all day, and I know a couple of others do as well. I'd love it if
> other people would use it some more. We call it the 4xx series, because
> the version numbers were started at 404. To load it, close all of your
> existing browsers, and then load the latest 4xx version of
> Tools-RefactoringBrowser bundle from the Open Repository. 2 of the weeks
> are allocated doing other things (vacation and ESUG), so I don't expect
> to get this swapped over until the september builds realistically.
>
> If you do decide to add a new tool to said browser... I'd look at:
>
> 1) CodeModel class comment
> 2) methods found in CodeModel class>>tab parts
> 3) Clone one of the CodeToolSelectionPolicy subclasses
> 4) Clone one of the CodeTool subclasses
>
> The status bar is pluggable in the browser as well. I used that to plug
> in the SUnitToo(ls) controls. Look at CodeModel class comment for that
> as well. The API's much more free form there (make a VisualPart that
> understands codeModel: and touch and register it with a method like
> those found in 'status parts').
>
> The top part... is still a bit tougher. It's on my agenda to work on
> that, because I'd like to integrate something like Anthony Lander's
> Hierarchy thing, and make the method iconFor: API more pluggable, and
> maybe some of the Dynamic Protocols and...
>
> --
> Travis Griggs
> Objologist
> "Dying men never wish they'd spent more time at the office"
>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: How to enhance RB

Travis Griggs-3
In reply to this post by Björn Eiderbäck-3
On Aug 9, 2007, at 2:11, Björn Eiderbäck wrote:

To get the browser working I had to add a method

Object>>invalidateRectangle: xx

                "Just a fix to get the new browser working"

 

Since  in

Refactory.Browser.RefactoringBrowser>>invalidateTabs

                self rbTabs selectionIndex: (tools indexOf: currentBuffer value).

                (self builder componentAt: #rbTabs)

                                invalidateRectangle: (Rectangle origin: 0 @ 0

                                                                corner: self builder window width @ 28)

 

 

the message

   (self builder componentAt: #rbTabs)

resulted in an UndefinedObject.

 

Maybe there is  a better fix…

But coding via the inspector  (Object inspect) and rapidly writing this solved the problem.

This is odd Björn. I load this all the time. Allthough, I'm loading against latest development builds...

What version are you loading into? Is there a chance you have a stale browser hanging around? That is, you closed all browsers before loading, but was RefactoringBrowser allInstances empty?

Thanks for the feedback.

--
Travis Griggs
Objologist
"There are a thousand hacking at the branches of evil to one who is striking at the root" - Henry David Thoreau


Reply | Threaded
Open this post in threaded view
|

RE: How to enhance RB

Björn Eiderbäck-3

I load into Pre-Release 7.5.1 (aug07.1) of den 6 augusti 2007.

I closed all browser windows, but not workspaces,  before I loaded.

I didn’t check if RefactoringBrowser allInstances was empty before loading.

But strangely, now after loading, one browser seems to be hanging (without a window).

Even if I execute “RefactoringBrowser allInstances do: [:w | w closeAndUnschedule]” and do a “Collect All Garbage” there is one (non visible) RefactoringBrowser instance left.

I am a little bit busy at the moment but could give it a new try later on.

 

/Björn

 

From: Travis Griggs [mailto:[hidden email]]
Sent: den 9 augusti 2007 17:41
To: VWNC List
Subject: Re: How to enhance RB

 

On Aug 9, 2007, at 2:11, Björn Eiderbäck wrote:



To get the browser working I had to add a method

Object>>invalidateRectangle: xx

                "Just a fix to get the new browser working"

 

Since  in

Refactory.Browser.RefactoringBrowser>>invalidateTabs

                self rbTabs selectionIndex: (tools indexOf: currentBuffer value).

                (self builder componentAt: #rbTabs)

                                invalidateRectangle: (Rectangle origin: 0 @ 0

                                                                corner: self builder window width @ 28)

 

 

the message

   (self builder componentAt: #rbTabs)

resulted in an UndefinedObject.

 

Maybe there is  a better fix…

But coding via the inspector  (Object inspect) and rapidly writing this solved the problem.

This is odd Björn. I load this all the time. Allthough, I'm loading against latest development builds...

 

What version are you loading into? Is there a chance you have a stale browser hanging around? That is, you closed all browsers before loading, but was RefactoringBrowser allInstances empty?

 

Thanks for the feedback.

 

--

Travis Griggs

Objologist

"There are a thousand hacking at the branches of evil to one who is striking at the root" - Henry David Thoreau



 

Reply | Threaded
Open this post in threaded view
|

Re: How to enhance RB

Niall Ross
Dear Björn,

 > I closed all browser windows, but not workspaces, before I loaded.

Accidentally creating a workspace variable that holds something you want
GCed is an easy mistake to make (and the reason I always explicitly
declare temps in workspaces). Apologies if I'm suggesting the very very
obvious; just a thought.

BTW, the custom refactoring releases (look for Tools-Refactoring Browser
versions with CS... version name and 'released' blessing level) are all
tested to load OK even if the image has open RBs browsing code. You may
like to try the 7.5 CS11 RC3 release. Unloading should likewise be safe.

Of course, I'm sure you could get RBs into complex states - not just
browsing code - such that loading and unloading custom refactoring code
would hiccough. Obviously it's prudent to close everything when loading
a changed RB.

Yours faithfully
Niall Ross

> I load into Pre-Release 7.5.1 (aug07.1) of den 6 augusti 2007.
>
> I closed all browser windows, but not workspaces, before I loaded.
>
> I didn’t check if RefactoringBrowser allInstances was empty before
> loading.
>
> But strangely, now after loading, one browser seems to be hanging
> (without a window).
>
> Even if I execute “RefactoringBrowser allInstances do: [:w | w
> closeAndUnschedule]” and do a “Collect All Garbage” there is one (non
> visible) RefactoringBrowser instance left.
>
> I am a little bit busy at the moment but could give it a new try later on.
>
> /Björn
>
> *From:* Travis Griggs [mailto:[hidden email]]
> *Sent:* den 9 augusti 2007 17:41
> *To:* VWNC List
> *Subject:* Re: How to enhance RB
>
> On Aug 9, 2007, at 2:11, Björn Eiderbäck wrote:
>
>
>
> To get the browser working I had to add a method
>
> Object>>invalidateRectangle: xx
>
> "Just a fix to get the new browser working"
>
> Since in
>
> Refactory.Browser.RefactoringBrowser>>invalidateTabs
>
> self rbTabs selectionIndex: (tools indexOf: currentBuffer value).
>
> (self builder componentAt: #rbTabs)
>
> invalidateRectangle: (Rectangle origin: 0 @ 0
>
> corner: self builder window width @ 28)
>
> the message
>
> (self builder componentAt: #rbTabs)
>
> resulted in an UndefinedObject.
>
> Maybe there is a better fix…
>
> But coding via the inspector (Object inspect) and rapidly writing this
> solved the problem.
>
> This is odd Björn. I load this all the time. Allthough, I'm loading
> against latest development builds...
>
> What version are you loading into? Is there a chance you have a stale
> browser hanging around? That is, you closed all browsers before
> loading, but was RefactoringBrowser allInstances empty?
>
> Thanks for the feedback.
>
> --
>
> Travis Griggs
>
> Objologist
>
> "There are a thousand hacking at the branches of evil to one who is
> striking at the root" - Henry David Thoreau
>
>
>




Reply | Threaded
Open this post in threaded view
|

Re: How to enhance RB

Niall Ross
In reply to this post by Andres Fortier-2
Dear Andres Fortier wrote:

> Hi list,
>         I was wondering if there is a step-by-step guide on how to
> make basic extensions to the RB. Right now I need to add a new tab at
> the bottom pane to add a new tool (like the Rewrite tab), but ideally
> I'm looking for something broader (like addin refactorings, new panes,
> etc.). Any hints would be appreciated.

1) Custom Refactorings
================
The RB custom refactoring project's guide was unfortunately spammed a
while back along with the rest of the Camp Smalltalk wiki at uiuc.  I've
managed to recover some of our text on writing custom refactorings from
an archive and will republish it;  meanwhile I attach a zip of these raw
pages FYI.

See customrefactor.sourceforge.net for project info.  (You should
certainly study what we have done if you want to extend the rewrite
tool, which we've extended.)  BTW, if you will be at the Camp Smalltalk
in Lugano the weekend after next (i.e. the weekend before ESUG), you
could pair with us on the project which would certainly get you started
writing custom refactorings.

2) Custom Code Tools
================
Travis has listed the places to look.  To create a code tool you need a
subclass of CodeTool, or of one of its subclasses.

 - If you plan to tweak how source is presented in specific cases you
may want to subclass BrowserCodeTool.

 - The custom refactoring project has several subclasses of
BrowserTextTool to make the panes of the rewrite tool into code tools in
their own right.  The custom refactoring releases are in the open
repository:  look for Tools-Refactoring Browser versions with CS...  
version name and 'released' blessing level.  Their tests are in the
RefactoringBrowserTests bundle.  (N.B.the public store also has old
bundles with similar names that you should ignore.)

You also need a subclass of CodeToolSelectionPolicy which will determine
when the tab appears.  This handles everything to do with adding, naming
and removing the tab.  It returns the desired code tool class by
overriding either #toolClass or some more specific method called by the
superclass, e.g. #codeToolClassForSelector:andClass:, if you only want
to display your tool when a method is selected.  As above, subclass a
more detailed policy class if your tool is shadowing a specific case.  
In either case, return nil when your tab should not appear;  return your
tool or the super call / standard call as appropriate otherwise.

CodeModel has classInstVar 'defaultSelectionPolicies':  a tab that every
RB should be able to show gets inserted here.  The default set is
initialised when the RB is loaded and methods #addSelectionPolicy and
#removeSelectionPolicy are called by packages loading and unloading
additional tools (usually automatically called via class initialization
methods but a given package may do it explicitly via postLoad and
preUnload code).  Each RB buffer's CodeModel instance has its tools
initialized from the class-side's list.

If your tool will modify an existing tool, on the same tab, instead of
adding a new tab, you need to replace and restore, not add and remove.  
The distibuted RBSUnitExtensions, which wrapped the source tool, did not
IMO handle this well and was apt to get confused when other tools
wrapping the same base tool (e.g. File Repository).  The custom
refactoring project has published a version of RBSUnitExtensions to the
public store that refactors it to put tab and tool issues on the correct
classes;  I recommend using this, not the distributed version, to guide
any wrap-existing-in-place code tool you write.

The custom refactoring project has also made mild changes to the code
tool policy code in general, to add comments, to make it easier to add
new tools, and to offer strategies for e.g. the case where unloading
when an RB is displaying the tool (not claimed to be the last word, as
we remark in method comments).  Your feedback is welcome.

HTH.
          Yours faithfully
             Niall Ross










CustRefact-CSWikiRecovered.zip (81K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: How to enhance RB

Andres Fortier-2
Niall,
       thank you very much for such a detailed explanation; I'm
finishing some GUI details of the tool and the next step is to integrate
it to de RB, so I guess I'll be doing it in the next few days.

Thanks again!

Andrés



Niall Ross escribió:

> Dear Andres Fortier wrote:
>
>> Hi list,
>>         I was wondering if there is a step-by-step guide on how to
>> make basic extensions to the RB. Right now I need to add a new tab at
>> the bottom pane to add a new tool (like the Rewrite tab), but ideally
>> I'm looking for something broader (like addin refactorings, new panes,
>> etc.). Any hints would be appreciated.
>
> 1) Custom Refactorings
> ================
> The RB custom refactoring project's guide was unfortunately spammed a
> while back along with the rest of the Camp Smalltalk wiki at uiuc.  I've
> managed to recover some of our text on writing custom refactorings from
> an archive and will republish it;  meanwhile I attach a zip of these raw
> pages FYI.
>
> See customrefactor.sourceforge.net for project info.  (You should
> certainly study what we have done if you want to extend the rewrite
> tool, which we've extended.)  BTW, if you will be at the Camp Smalltalk
> in Lugano the weekend after next (i.e. the weekend before ESUG), you
> could pair with us on the project which would certainly get you started
> writing custom refactorings.
>
> 2) Custom Code Tools
> ================
> Travis has listed the places to look.  To create a code tool you need a
> subclass of CodeTool, or of one of its subclasses.
>
> - If you plan to tweak how source is presented in specific cases you may
> want to subclass BrowserCodeTool.
>
> - The custom refactoring project has several subclasses of
> BrowserTextTool to make the panes of the rewrite tool into code tools in
> their own right.  The custom refactoring releases are in the open
> repository:  look for Tools-Refactoring Browser versions with CS...  
> version name and 'released' blessing level.  Their tests are in the
> RefactoringBrowserTests bundle.  (N.B.the public store also has old
> bundles with similar names that you should ignore.)
>
> You also need a subclass of CodeToolSelectionPolicy which will determine
> when the tab appears.  This handles everything to do with adding, naming
> and removing the tab.  It returns the desired code tool class by
> overriding either #toolClass or some more specific method called by the
> superclass, e.g. #codeToolClassForSelector:andClass:, if you only want
> to display your tool when a method is selected.  As above, subclass a
> more detailed policy class if your tool is shadowing a specific case.  
> In either case, return nil when your tab should not appear;  return your
> tool or the super call / standard call as appropriate otherwise.
>
> CodeModel has classInstVar 'defaultSelectionPolicies':  a tab that every
> RB should be able to show gets inserted here.  The default set is
> initialised when the RB is loaded and methods #addSelectionPolicy and
> #removeSelectionPolicy are called by packages loading and unloading
> additional tools (usually automatically called via class initialization
> methods but a given package may do it explicitly via postLoad and
> preUnload code).  Each RB buffer's CodeModel instance has its tools
> initialized from the class-side's list.
>
> If your tool will modify an existing tool, on the same tab, instead of
> adding a new tab, you need to replace and restore, not add and remove.  
> The distibuted RBSUnitExtensions, which wrapped the source tool, did not
> IMO handle this well and was apt to get confused when other tools
> wrapping the same base tool (e.g. File Repository).  The custom
> refactoring project has published a version of RBSUnitExtensions to the
> public store that refactors it to put tab and tool issues on the correct
> classes;  I recommend using this, not the distributed version, to guide
> any wrap-existing-in-place code tool you write.
>
> The custom refactoring project has also made mild changes to the code
> tool policy code in general, to add comments, to make it easier to add
> new tools, and to offer strategies for e.g. the case where unloading
> when an RB is displaying the tool (not claimed to be the last word, as
> we remark in method comments).  Your feedback is welcome.
>
> HTH.
>          Yours faithfully
>             Niall Ross
>
>
>
>
>
>
>
>
>