Hi Tudor,

On Wed, May 18, 2016 at 09:26:51AM +0200, Tudor Girba wrote:
> Hi,
> 
> > On May 16, 2016, at 7:59 AM, Alistair Grant <akgrant0...@gmail.com> wrote:
> > 
> > On Mon, May 16, 2016 at 05:42:54AM +0200, Tudor Girba wrote:
> > 
> >  ...
> >> It works because the format block takes an optional argument with the input
> >> entity. However, the semantics are not going to be quite the same. In
> >> isolation, the behavior will be identical. However, the difference comes 
> >> when
> >> you try to reuse a presentation. 
> >> 
> >> Let’s look at an example. This is how an AST node displays the source:
> >> 
> >> RBProgramNode>>gtInspectorSourceCodeIn: composite
> >> <gtInspectorPresentationOrder: 30> 
> >> ^ composite pharoMethod 
> >> title: 'Source code’;
> >> display: [ self source ];
> >> ...
> >> 
> >> Like this, the block closure can simply delegate to the corresponding ast 
> >> node
> >> to display the source:
> >> 
> >> BlockClosure>>gtInspectorSourceCodeIn: composite 
> >> <gtInspectorPresentationOrder: 40>
> >> self sourceNode gtInspectorSourceCodeIn: composite
> >> 
> >> And a keymap object which holds a block in an action instance variable, can
> >> simply delegate to the block closure object to display the source:
> >> 
> >> KMKeymap>>gtInspectorSourceCodeIn: composite
> >> <gtInspectorPresentationOrder: 30> 
> >> ^ self action gtInspectorSourceCodeIn: composite
> >> 
> >> 
> >> If the ProgramNode definition would have been implemented like:
> >> display: [ :each | each source ]
> >> 
> >> then when inspecting the block object, we would have gotten the block 
> >> object as
> >> each, and not the AST node.
> >> 
> >> Does this explanation make sense?
> > 
> > So using this code is going to be more flexible than
> > 
> >    ^ composite text
> >        title: 'Meme';
> >        format: [self asText]
> > 
> > since the format object isn't supplied the optional arguments.
> 
> Actually, the less flexible approach is:
>       format: [ :each | each source ]
> 
> Given that you define the extension directly in the class of the object you 
> want to inspect, you essentially always want to apply the transformations on 
> self, regardless of the “each” block argument. In this way, you can reuse 
> this presentation in other objects through delegation like I mentioned above.
> 
> In any case, I am happy to hear that you want to extend you object. Could you 
> let us know the use case?

I'm porting my personal note taking system that I originally developed
in Python / Django about 5 years ago to Pharo.

The main entity is what I call a "meme", which simply has a name, label
and description.  Any number of attachments may be added, e.g. URLs,
links to external files, internally managed files, etc.  Meme's are
related to each other as parents / children or peers.

The approach I'm taking is to be able to view each of the objects in the
standard Pharo inspectors, so for a meme its' name, label and
description are displayed as formatted text with clickable links (thus
the question that started this thread), relations to other memes are
displayed in a RTMondrian force graph (at the moment).

Being able to inspect the objects obviously helps with the debugging and
gives the system a live / exploratory feel.  Once that is working, I'll
start on a more custom interface which will be more practical for actual
note taking.

Does that answer your question?

Cheers,
Alistair


Reply via email to