Optimization/Alternate Methods

I’ve created a travelBarrier that disallows travel unless the player is wearing an object with the property ‘removesNakedness’ set to true:

+outfit: Wearable 'black grey outfit*outfits/clothing/clothes' 'black and grey outfit' "some description here" removesNakedness = true ;

[code]//The traveler must be wearing something that removes nakedness.
nakedBarrier: TravelBarrier

canTravelerPass(traveler) 
{         
    return me.contents.indexWhich({x:
                                     x.propDefined(&removesNakedness) 
                                     && x.removesNakedness
                                     && x.isWornBy(me)
                                     });
}

//Tells the traveler that they cannot be naked when travelling.    
//If they are carrying anything that they can wear in order to
//remove their nakedness, we tell them so.
explainTravelBarrier(traveler)
{
    "You're not going anywhere naked";
    
    //Finds any items carried by the player that will remove nakedness.
    local lst = [];
    foreach (local itm in me.contents)
    {
        if (itm.propDefined(&removesNakedness))
        {
            if (itm.removesNakedness) lst += itm;
        }
    }                

    if (lst.length > 0)
    {
        printRemoveNakednessItems(lst, true);
    }
    else
    {
        
        //If the player doesn't have any viable items, check the current location.
        local itm = firstObj(Wearable);
        while (itm)
        {
            if (itm.canBeTouchedBy(me) && itm.canBeSeenBy(me)) lst += itm;
            itm = nextObj(itm, Wearable);
        }
        
        if (lst.length > 0) printRemoveNakednessItems(lst, nil); else ".";
    }            
}

//Print the viable items.
printRemoveNakednessItems(lst, isCarrying)
{
    local suffix = nil;
    if (isCarrying) suffix = ' (which you are carrying)';
    
    ", but you may assuage this conviction (that is, the resolve to move about only when clothed) by wearing ";
    if (lst.length == 1)
    {                
        local idx = lst.createIterator();
        idx.getNext();
        local itm = idx.getCurVal;
        "<<itm.theName>><<suffix>>.";
    }
    else
    {
        "any of the following<<suffix>>: <.p>";
        foreach (local itm in lst)
        {
            "\n\t<<itm.aName>>";
        }
    }
}

; [/code]

  1. Is there any way to optimize (make more concise) the above?
  2. I’m assuming lazy evaluation in the anonymous function for canTravelerPass - is this a correct assumption?
  3. Are there alternate means to accomplish the same thing?
  4. This part:

local idx = lst.createIterator(); idx.getNext(); local itm = idx.getCurVal;
seems unwieldy - any other way to get an item/first item from a list?
5. What will happen when an NPC (or any other object) uses this barrier? (i.e. Do I need to do a check: if(traveler == me))…
6. When checking for viable objects in the current room, are canBeSeenBy and canBeTouchedBy sufficient? Is it possible for a coder to model (via adv3) a clothing object that, although suitable, wouldn’t show up for this list?