aspect IntroduceFactory { public MethodDecl ConstructorDecl.introduceFactory(boolean protectConstructor) { int vis = protectConstructor ? VIS_PRIVATE : getVisibility(); MethodDecl factory = createFactoryMethod(); for(Access acc : usesOfAllCopies()) { if(acc instanceof ClassInstanceExpr) { ClassInstanceExpr cie = (ClassInstanceExpr)acc; if(cie.hasTypeDecl()) { vis = Math.max(vis, VIS_PROTECTED); continue; } else if(cie.hostBodyDecl() == factory) { continue; } cie.replaceWith(factory.createLockedAccess(cie.getArgs())); } else if(acc instanceof SuperConstructorAccess) { vis = Math.max(vis, VIS_PROTECTED); } } getModifiers().setVisibility(vis); return factory; } public MethodDecl ConstructorDeclSubstituted.introduceFactory(boolean protectConstructor) { return sourceConstructorDecl().introduceFactory(protectConstructor); } public MethodDecl ParConstructorDecl.introduceFactory(boolean protectConstructor) { return sourceConstructorDecl().introduceFactory(protectConstructor); } public MethodDecl ConstructorDecl.doIntroduceFactory() { return doIntroduceFactory(true); } public MethodDecl ConstructorDecl.doIntroduceFactory(boolean protectConstructor) { MethodDecl factory = introduceFactory(protectConstructor); programRoot().eliminate(LOCKED_NAMES); return factory; } }