package lawOfDemeter.objectform;
import lawOfDemeter.Any;

/**
 * @authors David H. Lorenz and Pengcheng Wu
 * @version 0.4, 11/08/02
 */

public aspect Perthis extends ObjectSupplier
  perthis(Any.ConstructorExecution()) {
  before(Object target): // direct parts
    Any.Set(target) {
    Perthis.aspectOf(target).addAll(thisJoinPoint.getArgs());
  }
  after(Object thiz,Object target): // check
    Any.MethodCall(thiz,target) {
        if (!Global.globalPreferred.contains(target) && !Perthis.aspectOf(thiz).
contains(target))
           System.out.println(" !! LoD Object Violation !! " 
            + thisJoinPointStaticPart+at(thisJoinPointStaticPart));
  }

  public boolean contains(Object target) {
    return super.contains(target) 
      || Percflow.aspectOf().contains(target);
  }
  protected String at(org.aspectj.lang.JoinPoint.StaticPart jp) {
	return " at "
		+ jp.getSourceLocation().getFileName() + ":"
		+ jp.getSourceLocation().getLine() + ":"
		+ jp.getSourceLocation().getColumn();
  }
}

